def ica_routine(params, subj_inds, subj_d):
    """Loop over all classification parameters using extended infomax ICA"""
    scores = np.empty((len(params['t_wind_binned']),
                       len(params['n_components_list']), len(subj_inds),
                       params['cvs'], len(params['kernel_list']),
                       len(params['C_range']), len(params['g_range'])))
    scores[:] = np.nan
    for t_wind_i, t_wind in enumerate(params['t_wind_binned']):
        print '\t' + 'Time window: ' + str(t_wind),

        for comp_i, var_explained in enumerate(params['n_components_list']):

            ica = ICA(n_components=var_explained,
                      method=ICA_PARAMS['ica_init_params']['method'],
                      max_iter=ICA_PARAMS['ica_init_params']['max_iter'])
            for si, di in enumerate(subj_inds):
                # Pull data structures from dict
                maint_all = subj_d[di]['epo_mat'][patterns[0]][:, :, t_wind[0]:t_wind[1]]
                switch_all = subj_d[di]['epo_mat'][patterns[1]][:, :, t_wind[0]:t_wind[1]]
                '''
                temp_m = maint_all.reshape(maint_all.shape[0], -1)
                temp_s = switch_all.reshape(switch_all.shape[0], -1)

                data = np.concatenate((temp_m, temp_s), axis=0)
                '''
                target = np.concatenate((np.ones(maint_all.shape[0]) * -1,
                                        np.ones(switch_all.shape[0])), axis=0)

                # Construct dummy Raw object to use MNE's ICA computations
                info = create_info(ch_names=subj_d[di]['epo_mat'][patterns[0]].shape[1],
                                   sfreq=1. / bin_width, ch_types='eeg')
                info['bads'] = []

                # Set up cross-validation
                cv = StratifiedKFold(target, n_folds=params['cvs'])

                for ti, (train_idx, test_idx) in enumerate(cv):

                    # Refactor training data to (n_chan x n_features) for ICA
                    data_train = np.concatenate((maint_all, switch_all))[train_idx, :, :]
                    raw_train, train_shape = roll_raw(data_train, info)

                    # Fit ICA to training data
                    ica.fit(raw_train, verbose=False)

                    ###########################################################
                    # Construct raw from reshaped data
                    all_data = np.concatenate((maint_all, switch_all), axis=0)
                    raw_all, all_data_shape = roll_raw(all_data, info)

                    # Transform training and testing data
                    all_data_trans = ica._transform_raw(raw_all, None, None)
                    # Un-reshape training and testing data
                    all_data_trans = \
                        all_data_trans.reshape((all_data_trans.shape[0],
                                                all_data_shape[1],
                                                all_data_shape[2]))
                    all_data_trans = np.rollaxis(all_data_trans, axis=1)

                    # Formally construct training and testing data
                    # Reshape to (n_trials x n_features)
                    data_train_trans = all_data_trans[train_idx, :, :]
                    data_train_trans = data_train_trans.reshape(data_train_trans.shape[0], -1)
                    data_test_trans = all_data_trans[test_idx, :, :]
                    data_test_trans = data_test_trans.reshape(data_test_trans.shape[0], -1)

                    # Create training and test sets
                    data_dict = dict(X_train=data_train_trans,
                                     X_test=data_test_trans,
                                     y_train=target[train_idx],
                                     y_test=target[test_idx])

                    # Compute scores over given SVM parameters and store
                    try:
                        scores[t_wind_i, comp_i, si, ti, :, :, :] = \
                            cross_val_ica(data_dict, params['kernel_list'],
                                          params['C_range'], params['g_range'])
                    except:
                        'Error raised\nsubj: ' + str(di)
                        raise

        print ' ...  Done.'
    return scores
def ica_routine(data_m, data_s, params):
    """Loop over all classification parameters using extended infomax ICA"""

    scores = np.empty((len(params['n_components_list']), params['cvs'],
                       len(params['kernel_list']), len(params['C_range']),
                       len(params['g_range'])))

    # Iterate over time window, ICA components variance, subject, cross-val
    for comp_i, var_explained in enumerate(params['n_components_list']):

        ica = ICA(n_components=var_explained,
                  method=params['ica_init_params']['method'],
                  max_iter=params['ica_init_params']['max_iter'])

        # Get data and trial labels
        target = np.concatenate((np.ones(data_m.shape[0]) * -1,
                                 np.ones(data_s.shape[0])), axis=0)

        # Construct dummy Raw object to link into MNE's ICA computations
        info = create_info(ch_names=data_m.shape[1], sfreq=1. / bin_width,
                           ch_types='eeg')
        info['bads'] = []

        # Prepare cross-validation
        cv = StratifiedKFold(target, n_folds=params['cvs'])

        for ti, (train_idx, test_idx) in enumerate(cv):

            # Refactor training data to (n_chan x n_features) for ICA
            data_train = np.concatenate((data_m, data_s), axis=0)[train_idx, :, :]
            data_train = np.rollaxis(data_train, 1)
            raw_train = RawArray(data_train.reshape(data_train.shape[0], -1),
                                 info, verbose=False)

            # Fit ICA to training data
            ica.fit(raw_train, verbose=False)

            ###########################################################
            # Construct raw from reshaped data
            all_data = np.rollaxis(np.concatenate((data_m, data_s), axis=0), 1)

            all_data_shape = all_data.shape
            raw_all = RawArray(all_data.reshape(all_data.shape[0], -1),
                               info, verbose=False)

            # Transform training and testing data
            all_data_trans = ica._transform_raw(raw_all, None, None)

            # Un-reshape training and testing data to (n_comp  x  n_trials  x  n_times)
            all_data_trans = \
                all_data_trans.reshape((all_data_trans.shape[0],
                                        all_data_shape[1],
                                        all_data_shape[2]))
            all_data_trans = np.rollaxis(all_data_trans, axis=1)

            # Formally construct training and testing data
            # Reshape to (n_trials x n_features)
            data_train_trans = all_data_trans[train_idx, :, :]
            data_train_trans = data_train_trans.reshape(data_train_trans.shape[0], -1)
            data_test_trans = all_data_trans[test_idx, :, :]
            data_test_trans = data_test_trans.reshape(data_test_trans.shape[0], -1)

            # Create training and test sets
            data_dict = dict(X_train=data_train_trans,
                             X_test=data_test_trans,
                             y_train=target[train_idx],
                             y_test=target[test_idx])

            # Compute scores over given SVM parameters
            scores[comp_i, ti, :, :, :] = \
                cross_val_ica(data_dict, params['kernel_list'],
                              params['C_range'], params['g_range'])

    return scores