diff --git a/brainiak/reprsimil/__init__.py b/brainiak/reprsimil/__init__.py new file mode 100755 index 000000000..1e53fda7c --- /dev/null +++ b/brainiak/reprsimil/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2016 Mingbo Cai, Princeton Neuroscience Instititute, +# Princeton University +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A Bayesian method to perform Representational Similarity Analysis""" diff --git a/brainiak/reprsimil/brsa.py b/brainiak/reprsimil/brsa.py new file mode 100755 index 000000000..a9d849a52 --- /dev/null +++ b/brainiak/reprsimil/brsa.py @@ -0,0 +1,1340 @@ +# Copyright 2016 Mingbo Cai, Princeton Neuroscience Instititute, +# Princeton University +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Bayesian Representational Similarity Analysis (BRSA) + + This implementation is based on the following publications: + + .. [Cai2016] "A Bayesian method for reducing bias in neural + representational similarity analysis", + M.B. Cai, N. Schuck, J. Pillow, Y. Niv, + Neural Information Processing Systems 29, 2016. + A preprint is available at + https://doi.org/10.1101/073932 +""" + +# Authors: Mingbo Cai +# Princeton Neuroscience Institute, Princeton University, 2016 + +import numpy as np +import scipy +import scipy.optimize +import scipy.stats +import warnings +import time +from sklearn.base import BaseEstimator +from sklearn.utils import assert_all_finite +import logging +import brainiak.utils.utils as utils +import scipy.spatial.distance as spdist +warnings.filterwarnings('ignore') + + +logger = logging.getLogger(__name__) + +__all__ = [ + "BRSA", +] + + +class BRSA(BaseEstimator): + """Bayesian representational Similarity Analysis (BRSA) + + Given the time series of preprocessed neural imaging data and + the hypothetical neural response (design matrix) to + each experimental condition of interest, + calculate the shared covariance matrix of + the voxels(recording unit)' response to each condition, + and the relative SNR of each voxels. + The relative SNR could be considered as the degree of contribution + of each voxel to this shared covariance matrix. + A correlation matrix converted from the covariance matrix + will be provided as a quantification of neural representational similarity. + + .. math:: \textbf{Y = \textbf{X} \cdot \mbox{\boldmath{$\beta$}} + + \mbox{\boldmath{$\epsilon$}} + .. math:: \mbox{\boldmath{$\beta$}}_i \sim \textbf{N}(0,(s_{i} + \sigma_{i})^2 \textbf{U}) + + Parameters + ---------- + n_iter : int, default: 200 + Number of maximum iterations to run the algorithm. + rank : int, default: None + The rank of the covariance matrix. + If not provided, the covariance matrix will be assumed + to be full rank. When you have many conditions + (e.g., calculating the similarity matrix of responses to each event), + you might want to start with specifying a lower rank and use metrics + such as AIC or BIC to decide the optimal rank. + GP_space: boolean, default: False + Whether to impose a Gaussion Process (GP) prior on the log(pseudo-SNR). + If true, the GP has a kernel defined over spatial coordinate. + This is experimental and slow. I find that when SNR is genrally low, + smoothness can be overestimated. But I think this is better than + not imposing any regularization. + GP_inten: boolean, defualt: False + Whether to include a kernel definved over the intensity of image. + GP_space should be True as well if you want to use this, + because the smoothness should be primarily in space. + Smoothness in intensity is just complementary. + tol: tolerance parameter passed to the minimizer. + verbose : boolean, default: False + Verbose mode flag. + pad_DC: boolean, default: False + A column of all 1's will be padded to end of the design matrix + to account for residual baseline component in the signal. + We recommend removing DC component in your data but still + set this as True. If you include a baseline column yourself, + then you should check this as False. + In future version, we will include a seperate input + argument for all regressors you are not interested in, + such as DC component and motion parameters. + epsilon: a small number added to the diagonal element of the + covariance matrix in the Gaussian Process prior. This is + to ensure that the matrix is invertible. + space_smooth_range: the distance (in unit the same as what + you would use when supplying the spatial coordiates of + each voxel, typically millimeter) which you believe is + the maximum range of the length scale parameter of + Gaussian Process defined over voxel location. This is + used to impose a half-Cauchy prior on the length scale. + If not provided, the program will set it to half of the + maximum distance between all voxels. + inten_smooth_range: the difference in image intensity which + you believe is the maximum range of plausible length + scale for the Gaussian Process defined over image + intensity. Length scales larger than this are allowed, + but will be penalized. If not supplied, this parameter + will be set to half of the maximal intensity difference. + tau_range: the reasonable range of the standard deviation + of the Gaussian Process. Since the Gaussian Process is + imposed on the log(SNR), this range should not be too + large. 5 is a pretty loose range. This parameter is + used in a half-Cauchy prior on the standard deviation + init_iter: how many initial iterations to fit the model + without introducing the GP prior before fitting with it, + if GP_space or GP_inten is requested. This initial + fitting is to give the parameters a good starting point. + optimizer: the optimizer to use for minimizing cost function. + We use 'BFGS' as a default. Users can try other optimizer + coming with scipy.optimize.minimize, or a custom + optimizer. + + Attributes + ---------- + U_ : The shared covariance matrix, shape=[condition,condition]. + L_ : The Cholesky factor of the shared covariance matrix + (lower-triangular matrix), shape=[condition,condition]. + C_: the correlation matrix derived from the shared covariance matrix, + shape=[condition,condition] + nSNR_ : array, shape=[voxels,] + The pseuso-SNR of all voxels. + They are normalized such that the geometric mean is 1 + sigma_ : array, shape=[voxels,] + The estimated standard deviation of the noise in each voxel + Assuming AR(1) model, this means the standard deviation + of the refreshing noise. + rho_ : array, shape=[voxels,] + The estimated autoregressive coefficient of each voxel + bGP_ : scalar, only if GP_space or GP_inten is True. + the standard deviation of the GP prior + lGPspace_ : scalar, only if GP_space or GP_inten is True + the length scale of Gaussian Process prior of log(SNR) + lGPinten_: scalar, only if GP_inten is True + the length scale in fMRI intensity of the GP prior of log(SNR) + + Notes + ----- + The current version assumes noise is independent across voxels. + Real data typically has spatial correlation in noise. + This assumption might still introduce some bias in the result. + Spatial correlation will be included in a future version. + """ + + def __init__( + self, n_iter=50, rank=None, GP_space=False, GP_inten=False, + tol=2e-3, verbose=False, pad_DC=False, epsilon=0.0001, + space_smooth_range=None, inten_smooth_range=None, + tau_range=5.0, init_iter=20, optimizer='BFGS'): + self.n_iter = n_iter + self.rank = rank + self.GP_space = GP_space + self.GP_inten = GP_inten + self.tol = tol + self.verbose = verbose + self.pad_DC = pad_DC + self.epsilon = epsilon + # This is a tiny ridge added to the Gaussian Process + # covariance matrix template to gaurantee that it is invertible. + # Mathematically it means we assume that this proportion of the + # variance is always independent between voxels for the log(SNR2). + self.space_smooth_range = space_smooth_range + self.inten_smooth_range = inten_smooth_range + # The kernel of the Gaussian Process is the product of a kernel + # defined on spatial coordinate and a kernel defined on + # image intensity. + self.tau_range = tau_range + self.init_iter = init_iter + # When imposing smoothness prior, fit the model without this + # prior for this number of iterations. + self.optimizer = optimizer + return + + def fit(self, X, design, scan_onsets=None, coords=None, + inten=None): + """Compute the Bayesian RSA + + Parameters + ---------- + X: 2-D numpy array, shape=[time_points, voxels] + If you have multiple scans of the same participants that you + want to analyze together, you should concatenate them along + the time dimension after proper preprocessing (e.g. spatial + alignment), and specify the onsets of each scan in scan_onsets. + design: 2-D numpy array, shape=[time_points, conditions] + This is the design matrix. We will automatically pad a column + of all one's if pad_DC is True. + scan_onsets: optional, an 1-D numpy array, shape=[runs,] + this specifies the indices of X which correspond to the onset + of each scanning run. For example, if you have two experimental + runs of the same subject, each with 100 TRs, then scan_onsets + should be [0,100]. + If you do not provide the argument, the program will + assume all data are from the same run. + This only makes a difference for the inverse + of the temporal covariance matrix of noise. + coords: optional, 2-D numpy array, shape=[voxels,3] + This is the coordinate of each voxel, + used for implementing Gaussian Process prior. + inten: optional, 1-D numpy array, shape=[voxel,] + This is the average fMRI intensity in each voxel. + It should be calculated from your data without any preprocessing + such as z-scoring. Because it should reflect + whether a voxel is bright (grey matter) or dark (white matter). + A Gaussian Process kernel defined on both coordinate and intensity + imposes a smoothness prior on adjcent voxels + but with the same tissue type. The Gaussian Process + is experimental and has shown good performance on + some visual datasets. + """ + + logger.debug('Running Bayesian RSA') + + assert not self.GP_inten or (self.GP_inten and self.GP_space),\ + 'You must speficiy GP_space to True'\ + 'if you want to use GP_inten' + + # Check input data + assert_all_finite(X) + assert X.ndim == 2, 'The data should be 2 dimension ndarray' + + assert np.all(np.std(X, axis=0) > 0),\ + 'The time courses of some voxels do not change at all.'\ + ' Please make sure all voxels are within the brain' + + # check design matrix + assert_all_finite(design) + assert design.ndim == 2,\ + 'The design matrix should be 2 dimension ndarray' + assert np.all(np.std(design, axis=0) >= 0) or self.pad_DC,\ + 'You already included DC component in the '\ + 'design matrix. Please set pad_DC as False' + assert np.size(design, axis=0) == np.size(X, axis=0),\ + 'Design matrix and data do not '\ + 'have the same number of time points.' + if self.pad_DC: + logger.debug('Padding one more column of 1 to ' + 'the end of design matrix.') + design = np.concatenate((design, + np.ones([design.shape[0], 1])), axis=1) + assert self.rank is None or self.rank <= design.shape[1],\ + 'Your design matrix has fewer columns than the rank you set' + + # check scan_onsets validity + assert scan_onsets is None or\ + (np.max(scan_onsets) <= X.shape[0] and np.min(scan_onsets) >= 0),\ + 'Some scan onsets provided are out of the range of time points.' + + # check the size of coords and inten + if self.GP_space: + logger.debug('Fitting with Gaussian Process prior on log(SNR)') + assert coords is not None and coords.shape[0] == X.shape[1],\ + 'Spatial smoothness was requested by setting GP_space. '\ + 'But the voxel number of coords does not match that of '\ + 'data X, or voxel coordinates are not provided. '\ + 'Please make sure that coords is in the shape of '\ + '[ n_voxel x 3].' + assert coords.ndim == 2,\ + 'The coordinate matrix should be a 2-d array' + if self.GP_inten: + assert inten is not None and inten.shape[0] == X.shape[1],\ + 'The voxel number of intensity does not '\ + 'match that of data X, or intensity not provided.' + assert np.var(inten) > 0,\ + 'All voxels have the same intensity.' + if (not self.GP_space and coords is not None) or\ + (not self.GP_inten and inten is not None): + logger.warning('Coordinates or image intensity provided' + ' but GP_space or GP_inten is not set ' + 'to True. The coordinates or intensity are' + ' ignored.') + # Run Bayesian RSA + # Note that we have a change of notation here. Within _fit_RSA_UV, + # design matrix is named X and data is named Y, to reflect the + # generative model that data Y is generated by mixing the response + # X to experiment conditions and other neural activity. + # However, in fit(), we keep the tradition of scikit-learn that + # X is the input data to fit and y, a reserved name not used, is + # the label to map to from X. + if not self.GP_space: + # If GP_space is not requested, then the model is fitted + # without imposing any Gaussian Process prior on log(SNR^2) + self.U_, self.L_, self.nSNR_, self.sigma_, self.rho_ = \ + self._fit_RSA_UV(X=design, Y=X, scan_onsets=scan_onsets) + elif not self.GP_inten: + # If GP_space is requested, but GP_inten is not, a GP prior + # based on spatial locations of voxels will be imposed. + self.U_, self.L_, self.nSNR_, self.sigma_, self.rho_,\ + self.lGPspace_, self.bGP_ = self._fit_RSA_UV( + X=design, Y=X, scan_onsets=scan_onsets, coords=coords) + else: + # If both self.GP_space and self.GP_inten are True, + # a GP prior based on both location and intensity is imposed. + self.U_, self.L_, self.nSNR_, self.sigma_, self.rho_, \ + self.lGPspace_, self.bGP_, self.lGPinten_ = \ + self._fit_RSA_UV(X=design, Y=X, scan_onsets=scan_onsets, + coords=coords, inten=inten) + + if self.pad_DC: + self.U_ = self.U_[:-1, :-1] + self.L_ = self.L_[:-1, :self.rank] + self.C_ = utils.cov2corr(self.U_) + return self + + # The following 2 functions below generate templates used + # for constructing inverse of covariance matrix of AR(1) noise + # The inverse of covarian matrix is + # (I - rho1 * D + rho1**2 * F) / sigma**2. D is a matrix where all the + # elements adjacent to the diagonal are 1 and all others are 0. F is + # a matrix which is 1 on all diagonal elements except for in the first + # and last columns. We denote (I - rho1 * D + rho1**2 * F) with A. + # In the function calculating likelihood function, + # XTAX, YTAY_diag, YTAX all mean multiplying the inverse covariance matrix + # in between either the design matrix or the data. + # As one can see, even though rho1 and sigma2 might update as we keep + # fitting parameters, several terms stay unchanged and do not need to + # be re-calculated. + # For example, in X'AX = X'(I + rho1*D + rho1**2*F)X / sigma2, + # the products X'X, X'DX, X'FX, etc. can always be re-used if they + # are pre-calculated. Therefore, _D_gen and _F_gen constructs matrices + # D and F, and _prepare_data calculates these products that can be + # re-used. In principle, once parameters have been fitted for a + # dataset, they can be updated for new incoming data by adding the + # products X'X, X'DX, X'FX, X'Y etc. from new data to those from + # existing data, and refit the parameters starting from the ones + # fitted from existing data. + def _D_gen(self, TR): + if TR > 0: + return np.diag(np.ones(TR - 1), -1) \ + + np.diag(np.ones(TR - 1), 1) + else: + return np.empty([0, 0]) + + def _F_gen(self, TR): + if TR > 0: + F = np.eye(TR) + F[0, 0] = 0 + F[TR - 1, TR - 1] = 0 + return F + else: + return np.empty([0, 0]) + + def _prepare_data(self, X, Y, n_T, n_V, scan_onsets=None): + """Prepares different forms of products of design matrix X and data Y, + or between themselves. These products are reused a lot during fitting. + So we pre-calculate them. Because of the fact that these are reused, + it is in principle possible to update the fitting as new data come in, + by just incrementally adding the products of new data and + their corresponding part of design matrix + """ + if scan_onsets is None: + # assume that all data are acquired within the same scan. + D = np.diag(np.ones(n_T - 1), -1) + np.diag(np.ones(n_T - 1), 1) + F = np.eye(n_T) + F[0, 0] = 0 + F[n_T - 1, n_T - 1] = 0 + else: + # Each value in the scan_onsets tells the index at which + # a new scan starts. For example, if n_T = 500, and + # scan_onsets = [0,100,200,400], this means that the time points + # of 0-99 are from the first scan, 100-199 are from the second, + # 200-399 are from the third and 400-499 are from the fourth + run_TRs = np.diff(np.append(scan_onsets, n_T)) + logger.debug('I infer that the number of volumes' + ' in each scan are: {}'.format(run_TRs)) + + D_ele = map(self._D_gen, run_TRs) + F_ele = map(self._F_gen, run_TRs) + D = [] + for d_ele in D_ele: + D = scipy.linalg.block_diag(D, d_ele) + F = [] + for f_ele in F_ele: + F = scipy.linalg.block_diag(F, f_ele) + # D and F above are templates for constructing + # the inverse of temporal covariance matrix of noise + + XTY = np.dot(X.T, Y) + XTDY = np.dot(np.dot(X.T, D), Y) + XTFY = np.dot(np.dot(X.T, F), Y) + + YTY_diag = np.zeros([np.size(Y, axis=1)]) + YTDY_diag = np.zeros([np.size(Y, axis=1)]) + YTFY_diag = np.zeros([np.size(Y, axis=1)]) + for i_V in range(n_V): + YTY_diag[i_V] = np.dot(Y[:, i_V].T, Y[:, i_V]) + YTDY_diag[i_V] = np.dot(np.dot(Y[:, i_V].T, D), Y[:, i_V]) + YTFY_diag[i_V] = np.dot(np.dot(Y[:, i_V].T, F), Y[:, i_V]) + + XTX = np.dot(X.T, X) + XTDX = np.dot(np.dot(X.T, D), X) + XTFX = np.dot(np.dot(X.T, F), X) + return XTY, XTDY, XTFY, YTY_diag, YTDY_diag, YTFY_diag, XTX, XTDX, XTFX + + def _calc_dist2_GP(self, coords=None, inten=None, + GP_space=False, GP_inten=False): + # calculate the square of difference between each voxel's location + # coorinates and image intensity. + if GP_space: + assert coords is not None, 'coordinate is not provided' + # square of spatial distance between every two voxels + dist2 = spdist.squareform(spdist.pdist(coords, 'sqeuclidean')) + # set the hyperparameter for the GP process: + if self.space_smooth_range is None: + space_smooth_range = np.max(dist2)**0.5 / 2.0 + # By default, we assume the length scale should be + # within half the size of ROI. + else: + space_smooth_range = self.space_smooth_range + + if GP_inten: + assert inten is not None, 'intensity is not provided' + # squre of difference between intensities of + # # every two voxels + inten_diff2 = spdist.squareform( + spdist.pdist(inten[:, None], 'sqeuclidean')) + # set the hyperparameter for the GP process: + if self.inten_smooth_range is None: + inten_smooth_range = np.max(inten_diff2)**0.5 / 2.0 + # By default, we assume the length scale should be + # within half the maximum difference of intensity. + else: + inten_smooth_range = self.inten_smooth_range + n_smooth = 2 + else: + inten_diff2 = None + inten_smooth_range = None + n_smooth = 1 + else: + n_smooth = 0 + dist2 = None + inten_diff2 = None + GP_inten = False + space_smooth_range = None + inten_smooth_range = None + return dist2, inten_diff2, space_smooth_range, inten_smooth_range,\ + n_smooth + + def _build_index_param(self, n_l, n_V, n_smooth): + """ Build dictionaries to retrieve each parameter + from the combined parameters. + """ + idx_param_sing = {'Cholesky': np.arange(n_l), + 'log_sigma2': n_l, 'a1': n_l + 1} + # for simplified fitting + idx_param_fitU = {'Cholesky': np.arange(n_l), + 'a1': np.arange(n_l, n_l + n_V)} + # for the likelihood function when we fit U (the shared covariance). + idx_param_fitV = {'log_SNR2': np.arange(n_V - 1), + 'c_space': n_V - 1, 'c_inten': n_V, + 'c_both': np.arange(n_V - 1, n_V - 1 + n_smooth)} + # for the likelihood functin when we fit V (reflected by SNR of + # each voxel) + return idx_param_sing, idx_param_fitU, idx_param_fitV + + def _fit_RSA_UV(self, X, Y, + scan_onsets=None, coords=None, inten=None): + """ The major utility of fitting Bayesian RSA. + Note that there is a naming change of variable. X in fit() + is changed to Y here, and design in fit() is changed to X here. + This is because we follow the tradition that X expresses the + variable defined (controlled) by the experimenter, i.e., the + time course of experimental conditions convolved by an HRF, + and Y expresses data. + However, in wrapper function fit(), we follow the naming + routine of scikit-learn. + """ + GP_inten = self.GP_inten + GP_space = self.GP_space + rank = self.rank + n_V = np.size(Y, axis=1) + n_T = np.size(Y, axis=0) + n_C = np.size(X, axis=1) + l_idx = np.tril_indices(n_C) + + t_start = time.time() + + if rank is not None: + # The rank of covariance matrix is specified + idx_rank = np.where(l_idx[1] < rank) + l_idx = (l_idx[0][idx_rank], l_idx[1][idx_rank]) + logger.debug('Using the rank specified by the user: ' + '{}'.format(rank)) + else: + rank = n_C + # if not specified, we assume you want to + # estimate a full rank matrix + logger.debug('Please be aware that you did not specify the rank' + ' of covariance matrix you want to estimate.' + 'I will assume that the covariance matrix shared ' + 'among voxels is of full rank.' + 'Rank = {}'.format(rank)) + logger.debug('Please be aware that estimating a matrix of ' + 'high rank can be very slow.' + 'If you have a good reason to specify a lower rank ' + 'than the number of experiment conditions, do so.') + + n_l = np.size(l_idx[0]) # the number of parameters for L + + XTY, XTDY, XTFY, YTY_diag, YTDY_diag, YTFY_diag, XTX, XTDX, XTFX = \ + self._prepare_data(X, Y, n_T, n_V, scan_onsets) + # Prepare the data for fitting. These pre-calculated matrices + # will be re-used a lot in evaluating likelihood function and + # gradient. + + dist2, inten_diff2, space_smooth_range, inten_smooth_range,\ + n_smooth = self._calc_dist2_GP( + coords=coords, inten=inten, + GP_space=GP_space, GP_inten=GP_inten) + # Calculating the distance between voxel locations and betweeen + # voxel intensities. These are used if a Gaussian Process prior + # is requested to regularize log(SNR^2) + + idx_param_sing, idx_param_fitU, idx_param_fitV = \ + self._build_index_param(n_l, n_V, n_smooth) + # Indexes to find each parameter in a combined parameter vector. + + current_GP = np.zeros(n_smooth) + + # We will perform the fitting in 2~3 steps: + # (1) A preliminary fitting assuming all voxels share + # exactly the same temporal covariance matrix for their noise. + # SNR is assumed to be 1 for all voxels in this fitting. + # Therefore, there are only n_l+2 free parameters. + # (2) (optional) A fitting which allows each voxel to have their + # own pseudo-SNR and AR(1) coefficients. But no Gaussian Process + # prior is imposed on log(SNR). This step is neglected if GP + # prior is not requested. This step allows the SNR parameters to + # move closer to their correct values before GP is introduced. + # This step alternately fits the shared covariance and voxel- + # specific variance. It fits for init_iter steps and the + # tolerance is also increased by a factor of 5 to speed up + # fitting. + # (3) Final fitting. If GP prior is requested, it will be + # introduced in this step. Otherwise, just fit as the previous + # step, but using un-altered tolerance setting, and n_iter + # as the number of iteration. + + # Step 1 fitting, with a simplified model + current_vec_U_chlsk_l_AR1, current_a1, current_logSigma2 = \ + self._initial_fit_singpara( + XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, X, Y, idx_param_sing, + l_idx, n_C, n_T, n_V, n_l, rank) + + current_logSNR2 = -current_logSigma2 + norm_factor = np.mean(current_logSNR2) + current_logSNR2 = current_logSNR2 - norm_factor + current_vec_U_chlsk_l_AR1 = current_vec_U_chlsk_l_AR1 \ + * np.exp(norm_factor / 2.0) + + # Step 2 fitting, which only happens if + # GP prior is requested + if GP_space: + current_vec_U_chlsk_l_AR1, current_a1, current_logSNR2 \ + = self._fit_diagV_noGP( + XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_vec_U_chlsk_l_AR1, + current_a1, current_logSNR2, + idx_param_fitU, idx_param_fitV, + l_idx, n_C, n_T, n_V, n_l, rank) + + current_GP[0] = np.log(np.min( + dist2[np.tril_indices_from(dist2, k=-1)])) + # We start fitting the model with GP prior with a small + # length scale: the size of voxels. + # Alternatively, initialize with a large distance. + # Further testing of initial parameters need to be done. + +# current_GP[0] = np.log(np.max(dist2)/4.0) + + logger.debug('current GP[0]:{}'.format(current_GP[0])) + if GP_inten: + current_GP[1] = np.log(np.maximum( + np.percentile(inten_diff2[np.tril_indices_from( + inten_diff2, k=-1)], 5), 0.5)) + logger.debug( + 'current GP[1]:{}'.format(current_GP[1])) + # We start the length scale for intensity with + # a small value. A heuristic is 5 percentile of + # all the square differences. But it should not be + # smaller than 0.5. This limit is set in case + # many voxels have close to equal intensities, + # which might render 5 percential to 0. + + # Step 3 fitting. + logger.debug('indexing:{}'.format(idx_param_fitV)) + logger.debug('initial GP parameters:{}'.format(current_GP)) + current_vec_U_chlsk_l_AR1, current_a1, current_logSNR2,\ + current_GP = self._fit_diagV_GP( + XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_vec_U_chlsk_l_AR1, + current_a1, current_logSNR2, current_GP, n_smooth, + idx_param_fitU, idx_param_fitV, + l_idx, n_C, n_T, n_V, n_l, rank, + GP_space, GP_inten, dist2, inten_diff2, + space_smooth_range, inten_smooth_range) + + logger.debug('final GP parameters:{}'.format(current_GP)) + estU_chlsk_l_AR1_UV = np.zeros([n_C, rank]) + estU_chlsk_l_AR1_UV[l_idx] = current_vec_U_chlsk_l_AR1 + + est_cov_AR1_UV = np.dot(estU_chlsk_l_AR1_UV, estU_chlsk_l_AR1_UV.T) + + est_rho1_AR1_UV = 2 / np.pi * np.arctan(current_a1) + est_SNR_AR1_UV = np.exp(current_logSNR2 / 2.0) + + # Calculating est_sigma_AR1_UV + YTAY = YTY_diag - est_rho1_AR1_UV * YTDY_diag + \ + est_rho1_AR1_UV**2 * YTFY_diag + XTAX = XTX[np.newaxis, :, :] \ + - est_rho1_AR1_UV[:, np.newaxis, np.newaxis] \ + * XTDX[np.newaxis, :, :] \ + + est_rho1_AR1_UV[:, np.newaxis, np.newaxis]**2\ + * XTFX[np.newaxis, :, :] + # dimension: space*feature*feature + XTAY = XTY - est_rho1_AR1_UV * XTDY + est_rho1_AR1_UV**2 * XTFY + # dimension: feature*space + LTXTAY = np.dot(estU_chlsk_l_AR1_UV.T, XTAY) + # dimension: rank*space + + LAMBDA_i = np.zeros([n_V, rank, rank]) + for i_v in range(n_V): + LAMBDA_i[i_v, :, :] = np.dot(np.dot( + estU_chlsk_l_AR1_UV.T, XTAX[i_v, :, :]), estU_chlsk_l_AR1_UV)\ + * est_SNR_AR1_UV[i_v]**2 + LAMBDA_i += np.eye(rank) + # dimension: space*rank*rank + LAMBDA = np.linalg.inv(LAMBDA_i) + # dimension: space*rank*rank + YTAXL_LAMBDA = np.einsum('ijk,ki->ij', LAMBDA, LTXTAY) + # dimension: space*rank + YTAXL_LAMBDA_LT = np.dot(YTAXL_LAMBDA, estU_chlsk_l_AR1_UV.T) + # dimension: space*feature + + est_sigma_AR1_UV = ((YTAY - est_SNR_AR1_UV**2 * + np.sum(YTAXL_LAMBDA_LT * XTAY.T, axis=1)) + / n_T)**0.5 + + t_finish = time.time() + logger.debug( + 'total time of fitting: {} seconds'.format(t_finish - t_start)) + if GP_space: + est_space_smooth_r = np.exp(current_GP[0] / 2.0) + if GP_inten: + est_intensity_kernel_r = np.exp(current_GP[1] / 2.0) + K_major = np.exp(- (dist2 / est_space_smooth_r**2 + + inten_diff2 / est_intensity_kernel_r**2) + / 2.0) + K = K_major + np.diag(np.ones(n_V) * self.epsilon) + est_std_log_SNR = (np.dot(current_logSNR2, np.dot( + np.linalg.inv(K), current_logSNR2)) / n_V / 4)**0.5 + # divided by 4 because we used + # log(SNR^2) instead of log(SNR) + return est_cov_AR1_UV, estU_chlsk_l_AR1_UV, est_SNR_AR1_UV, \ + est_sigma_AR1_UV, est_rho1_AR1_UV, est_space_smooth_r, \ + est_std_log_SNR, est_intensity_kernel_r + # When GP_inten is True, the following lines won't be reached + else: + K_major = np.exp(- dist2 / est_space_smooth_r**2 / 2.0) + K = K_major + np.diag(np.ones(n_V) * self.epsilon) + est_std_log_SNR = (np.dot(current_logSNR2, np.dot( + np.linalg.inv(K), current_logSNR2)) / n_V / 4)**0.5 + return est_cov_AR1_UV, estU_chlsk_l_AR1_UV, est_SNR_AR1_UV, \ + est_sigma_AR1_UV, est_rho1_AR1_UV, est_space_smooth_r, \ + est_std_log_SNR + else: + return est_cov_AR1_UV, estU_chlsk_l_AR1_UV, est_SNR_AR1_UV, \ + est_sigma_AR1_UV, est_rho1_AR1_UV + + def _initial_fit_singpara(self, XTX, XTDX, XTFX, + YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, X, Y, idx_param_sing, + l_idx, n_C, n_T, n_V, n_l, rank): + """ Perform initial fitting of a simplified model, which assumes + that all voxels share exactly the same temporal covariance + matrix for their noise (the same noise variance and + auto-correlation). The SNR is implicitly assumed to be 1 + for all voxels. + """ + beta_hat = np.linalg.lstsq(X, Y)[0] + residual = Y - np.dot(X, beta_hat) + # point estimates of betas and fitting residuals without assuming + # the Bayesian model underlying RSA. + + # There are several possible ways of initializing the covariance. + # (1) start from the point estimation of covariance + + # cov_point_est = np.cov(beta_hat) + # current_vec_U_chlsk_l_AR1 = \ + # np.linalg.cholesky(cov_point_est + \ + # np.eye(n_C) * 1e-6)[l_idx] + + # We add a tiny diagonal element to the point + # estimation of covariance, just in case + # the user provides data in which + # n_V is smaller than n_C + + # (2) start from identity matrix + + # current_vec_U_chlsk_l_AR1 = np.eye(n_C)[l_idx] + + # (3) random initialization + + current_vec_U_chlsk_l_AR1 = np.random.randn(n_l) + # vectorized version of L, Cholesky factor of U, the shared + # covariance matrix of betas across voxels. + + rho1 = np.sum( + residual[0:-1, :] * residual[1:, :], axis=0) / \ + np.sum(residual[0:-1, :] * residual[0:-1, :], axis=0) + # Estimate of auto correlation assuming data includes pure noise. + log_sigma2 = np.log(np.var( + residual[1:, :] - residual[0:-1, :] * rho1, axis=0)) + # log of estimates of the variance of the "refreshing" noise + # of AR(1) process at each time point. + param0 = np.empty(np.sum(np.size(v) + for v in idx_param_sing.values())) + # Initial parameter + # Then we fill each part of the original guess of parameters + param0[idx_param_sing['Cholesky']] = current_vec_U_chlsk_l_AR1 + param0[idx_param_sing['a1']] = np.median(np.tan(rho1 * np.pi / 2)) + param0[idx_param_sing['log_sigma2']] = np.median(log_sigma2) + + # Fit it. + res = scipy.optimize.minimize( + self._loglike_AR1_singpara, param0, + args=(XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, l_idx, n_C, n_T, n_V, rank), + method=self.optimizer, jac=True, tol=self.tol, + options={'disp': self.verbose}) + current_vec_U_chlsk_l_AR1 = res.x[idx_param_sing['Cholesky']] + current_a1 = res.x[idx_param_sing['a1']] * np.ones(n_V) + # log(sigma^2) assuming the data include no signal is returned, + # as a starting point for the iteration in the next step. + # Although it should overestimate the variance, + # setting it this way might allow it to track log(sigma^2) + # more closely for each voxel. + return current_vec_U_chlsk_l_AR1, current_a1, log_sigma2 + + def _fit_diagV_noGP( + self, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_vec_U_chlsk_l_AR1, + current_a1, current_logSNR2, + idx_param_fitU, idx_param_fitV, + l_idx, n_C, n_T, n_V, n_l, rank): + """ (optional) second step of fitting, full model but without + GP prior on log(SNR). This is only used when GP is + requested. + """ + init_iter = self.init_iter + logger.debug('second fitting without GP prior' + ' for {} times'.format(init_iter)) + + # Initial parameters + param0_fitU = np.empty( + np.sum(np.size(v) for v in idx_param_fitU.values())) + param0_fitV = np.empty(np.size(idx_param_fitV['log_SNR2'])) + # We cannot use the same logic as the line above because + # idx_param_fitV also includes entries for GP parameters. + param0_fitU[idx_param_fitU['Cholesky']] = \ + current_vec_U_chlsk_l_AR1.copy() + param0_fitU[idx_param_fitU['a1']] = current_a1.copy() + param0_fitV[idx_param_fitV['log_SNR2']] = \ + current_logSNR2[:-1].copy() + + tol = self.tol * 5 + for it in range(0, init_iter): + # fit V, reflected in the log(SNR^2) of each voxel + res_fitV = scipy.optimize.minimize( + self._loglike_AR1_diagV_fitV, param0_fitV, + args=(XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_vec_U_chlsk_l_AR1, + current_a1, l_idx, n_C, n_T, n_V, rank, + False, False), + method=self.optimizer, jac=True, tol=tol, + options={'xtol': tol, 'disp': self.verbose, + 'maxiter': 4}) + + current_logSNR2[0:n_V - 1] = res_fitV.x + current_logSNR2[-1] = - np.sum(current_logSNR2[0:n_V - 1]) + + norm_fitVchange = np.linalg.norm(res_fitV.x - param0_fitV) + logger.debug('norm of parameter change after fitting V: ' + '{}'.format(norm_fitVchange)) + logger.debug('E[log(SNR2)^2]:', np.mean(current_logSNR2**2)) + + # The below lines are for debugging purpose. + # If any voxel's log(SNR^2) gets to non-finite number, + # something might be wrong -- could be that the data has + # nothing to do with the design matrix. + if np.any(np.logical_not(np.isfinite(current_logSNR2))): + logger.debug('Initial fitting: iteration {}'.format(it)) + logger.debug('current log(SNR^2): ' + '{}'.format(current_logSNR2)) + logger.debug('log(sigma^2) has non-finite number') + + param0_fitV = res_fitV.x.copy() + + # fit U, the covariance matrix, together with AR(1) param + param0_fitU[idx_param_fitU['Cholesky']] = \ + current_vec_U_chlsk_l_AR1 + param0_fitU[idx_param_fitU['a1']] = current_a1 + res_fitU = scipy.optimize.minimize( + self._loglike_AR1_diagV_fitU, param0_fitU, + args=(XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_logSNR2, l_idx, n_C, + n_T, n_V, rank), + method=self.optimizer, jac=True, tol=tol, + options={'xtol': tol, 'disp': self.verbose, + 'maxiter': 3}) + current_vec_U_chlsk_l_AR1 = \ + res_fitU.x[idx_param_fitU['Cholesky']] + current_a1 = res_fitU.x[idx_param_fitU['a1']] + norm_fitUchange = np.linalg.norm(res_fitU.x - param0_fitU) + logger.debug('norm of parameter change after fitting U: ' + '{}'.format(norm_fitUchange)) + param0_fitU = res_fitU.x.copy() + + if norm_fitVchange / np.sqrt(param0_fitV.size) < tol \ + and norm_fitUchange / np.sqrt(param0_fitU.size) \ + < tol: + break + return current_vec_U_chlsk_l_AR1, current_a1, current_logSNR2 + + def _fit_diagV_GP( + self, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_vec_U_chlsk_l_AR1, + current_a1, current_logSNR2, current_GP, n_smooth, + idx_param_fitU, idx_param_fitV, + l_idx, n_C, n_T, n_V, n_l, rank, GP_space, GP_inten, + dist2, inten_diff2, space_smooth_range, inten_smooth_range): + """ Last step of fitting. If GP is not requested, it will still + fit. + """ + tol = self.tol + n_iter = self.n_iter + logger.debug('Last step of fitting.' + ' for maximum {} times'.format(n_iter)) + + # Initial parameters + param0_fitU = np.empty( + np.sum(np.size(v) for v in idx_param_fitU.values())) + param0_fitV = np.empty(np.size(idx_param_fitV['log_SNR2']) + + np.size(idx_param_fitV['c_both'])) + # We cannot use the same logic as the line above because + # idx_param_fitV also includes entries for GP parameters. + param0_fitU[idx_param_fitU['Cholesky']] = \ + current_vec_U_chlsk_l_AR1.copy() + param0_fitU[idx_param_fitU['a1']] = current_a1.copy() + param0_fitV[idx_param_fitV['log_SNR2']] = \ + current_logSNR2[:-1].copy() + if self.GP_space: + param0_fitV[idx_param_fitV['c_both']] = current_GP.copy() + # param0_fitV[idx_param_fitV['c_space']] = \ + # current_GP[0] + # if self.GP_inten: + # param0_fitV[idx_param_fitV['c_inten']] = \ + # current_GP[1] + for it in range(0, n_iter): + # fit V + + res_fitV = scipy.optimize.minimize( + self._loglike_AR1_diagV_fitV, param0_fitV, args=( + XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, XTY, + XTDY, XTFY, current_vec_U_chlsk_l_AR1, current_a1, + l_idx, n_C, n_T, n_V, rank, GP_space, GP_inten, + dist2, inten_diff2, + space_smooth_range, inten_smooth_range), + method=self.optimizer, jac=True, + tol=tol, # 10**(-2 - 2 / n_iter * (it + 1)), + options={'xtol': tol, # 10**(-3 - 3 / n_iter * (it + 1)), + 'disp': self.verbose, 'maxiter': 6}) + + current_logSNR2[0:n_V - 1] = \ + res_fitV.x[idx_param_fitV['log_SNR2']] + current_logSNR2[n_V - 1] = -np.sum(current_logSNR2[0:n_V - 1]) + current_GP = res_fitV.x[idx_param_fitV['c_both']] + + fitVchange = res_fitV.x - param0_fitV + norm_fitVchange = np.linalg.norm(fitVchange) + + param0_fitV = res_fitV.x.copy() + logger.debug('norm of parameter change after fitting V: ' + '{}'.format(norm_fitVchange)) + logger.debug('E[log(SNR2)^2]: {}'.format( + np.mean(current_logSNR2**2))) + + # fit U + + param0_fitU[idx_param_fitU['Cholesky']] = \ + current_vec_U_chlsk_l_AR1 + param0_fitU[idx_param_fitU['a1']] = current_a1 + + res_fitU = scipy.optimize.minimize( + self._loglike_AR1_diagV_fitU, param0_fitU, + args=(XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, + XTY, XTDY, XTFY, current_logSNR2, l_idx, n_C, n_T, n_V, + rank), + method=self.optimizer, jac=True, + tol=tol, + options={'xtol': tol, + 'disp': self.verbose, 'maxiter': 6}) + current_vec_U_chlsk_l_AR1 = \ + res_fitU.x[idx_param_fitU['Cholesky']] + current_a1 = res_fitU.x[idx_param_fitU['a1']] + + fitUchange = res_fitU.x - param0_fitU + norm_fitUchange = np.linalg.norm(fitUchange) + logger.debug('norm of parameter change after fitting U: ' + '{}'.format(norm_fitUchange)) + param0_fitU = res_fitU.x.copy() + + # Debugging purpose. But it exceeds complexity limit + if GP_space: + logger.debug('current GP[0]: {}'.format(current_GP[0])) + logger.debug('gradient for GP[0]: {}'.format( + res_fitV.jac[idx_param_fitV['c_space']])) + if GP_inten: + logger.debug('current GP[1]: {}'.format(current_GP[1])) + logger.debug('gradient for GP[1]: {}'.format( + res_fitV.jac[idx_param_fitV['c_inten']])) + if np.max(np.abs(fitVchange)) < tol and \ + np.max(np.abs(fitUchange)) < tol: + break + + return current_vec_U_chlsk_l_AR1, current_a1, current_logSNR2,\ + current_GP + + # We fit two parts of the parameters iteratively. + # The following are the corresponding negative log likelihood functions. + + def _loglike_AR1_diagV_fitU(self, param, XTX, XTDX, XTFX, YTY_diag, + YTDY_diag, YTFY_diag, XTY, XTDY, XTFY, + log_SNR2, l_idx, n_C, n_T, n_V, rank): + # This function calculates the log likelihood of data given cholesky + # decomposition of U and AR(1) parameters of noise as free parameters. + # Free parameters are in param. + # The log of the square of signal to noise level in each voxel + # (the ratio of the diagonal elements in V and + # the noise variance) are fixed. This likelihood is iteratively + # optimized with the one with suffix _fitV. + # + # The meaing of U and V follow this wiki page of matrix normal + # distribution: + # https://en.wikipedia.org/wiki/Matrix_normal_distribution + # + # We assume betas of all voxels as a matrix follow this distribution. + # U describe the covariance between conditions. V describe the + # covariance between voxels. + # + # In this version, we assume that beta is independent between voxels + # and noise is also independent. + # By the assumption that noise is independent, we only need to pass + # the products X'X, X'Y and Y'Y, instead of X and Y + # Y'Y is passed in the form of its diagonal elements. + # DiagV means we assume that the variance of beta can be different + # between voxels. This means that V is a diagonal matrix instead of + # an identity matrix. The parameter includes the lower triangular + # part of the cholesky decomposition + # of U (flattened), then tan(rho1*pi/2) where rho1 is + # each voxel's autoregressive coefficient (assumging AR(1) model). + # Such parametrization avoids the need of boundaries + # for parameters. + + LL = 0.0 # log likelihood + + n_l = np.size(l_idx[0]) + # the number of parameters in the index of lower-triangular matrix + # This indexing allows for parametrizing only + # part of the lower triangular matrix (non-full rank covariance matrix) + L = np.zeros([n_C, rank]) + # lower triagular matrix L, cholesky decomposition of U + L[l_idx] = param[0:n_l] + + a1 = param[n_l:n_l + n_V] + rho1 = 2.0 / np.pi * np.arctan(a1) # auto-regressive coefficients + + SNR2 = np.exp(log_SNR2) + # each element of SNR2 is the ratio of the diagonal element on V + # to the variance of the fresh noise in that voxel + + # derivatives + deriv_L = np.zeros(np.shape(L)) + deriv_a1 = np.zeros(np.shape(rho1)) + + YTAY = YTY_diag - rho1 * YTDY_diag + rho1**2 * YTFY_diag + # dimension: space, + # A/sigma2 is the inverse of noise covariance matrix in each voxel. + # YTAY means Y'AY + XTAX = XTX[np.newaxis, :, :] - rho1[:, np.newaxis, np.newaxis]\ + * XTDX[np.newaxis, :, :] + rho1[:, np.newaxis, np.newaxis]**2\ + * XTFX[np.newaxis, :, :] + # dimension: space*feature*feature + XTAY = XTY - rho1 * XTDY + rho1**2 * XTFY + # dimension: feature*space + LTXTAY = np.dot(L.T, XTAY) + # dimension: rank*space + LAMBDA_i = np.zeros([n_V, rank, rank]) + for i_v in range(n_V): + LAMBDA_i[i_v, :, :] = np.eye(rank) \ + + np.dot(np.dot(L.T, XTAX[i_v, :, :]), L) * SNR2[i_v] + # dimension: space*rank*rank + LAMBDA = np.linalg.inv(LAMBDA_i) + # dimension: space*rank*rank + # LAMBDA is essentially the inverse covariance matrix of the + # posterior probability of alpha, which bears the relation with + # beta by beta = L * alpha, and L is the Cholesky factor of the + # shared covariance matrix U. refer to the explanation below + # Equation 5 in the NIPS paper. + YTAXL_LAMBDA = np.einsum('ijk,ki->ij', LAMBDA, LTXTAY) + # dimension: space*rank + YTAXL_LAMBDA_LT = np.dot(YTAXL_LAMBDA, L.T) + # dimension: space*feature (feature can be larger than rank) + + sigma2 = (YTAY - SNR2 * np.sum(YTAXL_LAMBDA_LT * XTAY.T, axis=1)) \ + / n_T + # dimension: space, + + LL = -np.sum(np.log(sigma2)) * n_T * 0.5 \ + + np.sum(np.log(1 - rho1**2)) * 0.5 \ + - np.sum(np.log(np.linalg.det(LAMBDA_i))) * 0.5 \ + - n_T / 2.0 + XTAXL = np.dot(XTAX, L) + # dimension: space*feature*rank + deriv_L = -np.einsum('ijk,ikl,i', XTAXL, LAMBDA, SNR2) - \ + np.einsum('ijk,ik,il,i', XTAXL, YTAXL_LAMBDA, YTAXL_LAMBDA, + SNR2**2 / sigma2) \ + + np.dot(XTAY / sigma2 * SNR2, YTAXL_LAMBDA) + # dimension: feature*rank + dXTAX_drho1 = -XTDX + 2 * rho1[:, np.newaxis, np.newaxis] * XTFX + # dimension: space*feature*feature + # because this term will be used twice below, we explicitly name + # it here. + deriv_a1 = 2.0 / (np.pi * (1 + a1**2)) * \ + (-rho1 / (1 - rho1**2) - + np.einsum('...ij,...ji', np.dot(LAMBDA, L.T), + np.dot(dXTAX_drho1, L)) * SNR2 / 2.0 + + np.sum((-XTDY + 2.0 * rho1 * XTFY) + * YTAXL_LAMBDA_LT.T, axis=0) / sigma2 * SNR2 + - np.einsum('...i,...ij,...j', + YTAXL_LAMBDA_LT, dXTAX_drho1, YTAXL_LAMBDA_LT) + / sigma2 / 2.0 * (SNR2**2.0) + - (-YTDY_diag + 2.0 * rho1 * YTFY_diag) / (sigma2 * 2.0)) + # dimension: space, + + deriv = np.zeros(np.size(param)) + deriv[0:n_l] = deriv_L[l_idx] + deriv[n_l:n_l + n_V] = deriv_a1 + + return -LL, -deriv + + def _loglike_AR1_diagV_fitV(self, param, XTX, XTDX, XTFX, YTY_diag, + YTDY_diag, YTFY_diag, XTY, XTDY, XTFY, + L_l, a1, l_idx, n_C, n_T, n_V, rank=None, + GP_space=False, GP_inten=False, dist2=None, + inten_dist2=None, space_smooth_range=None, + inten_smooth_range=None): + + # This function calculates the log likelihood of data given + # the log of the square of pseudo signal to noise ratio in each voxel. + # The free parameter log(SNR^2) is in param + # This likelihood is iteratively optimized with the one with _fitU. + # The cholesky factor of U and autoregressive coefficient + # in temporal AR(1) model for noise are fixed. + # Because the ML estimate of the variance of noise in each voxel + # (sigma^2) given other parameters has analytic form, + # we do not need to explicitly parametrize it. + # Just set it to the ML value. + # + # L_l is the lower triangular part of L, a1 is tan(rho1*pi/2), + # where rho1 is the autoregressive coefficient in each voxel + # We can optionally include Gaussion Process prior to log(SNR). + # This term is not included in _fitU, because log(SNR) + # are fixed in _fitU. + # GP_space and GP_inten are Boolean, indicating whether we want to + # include GP kernels either on voxel coordinates or intensity. + # dist2 and inten_dist2 are the squares of spatial distances and + # intensity differences ([n_voxel x n_voxel]. space_smooth_range + # and inten_smooth_range are the range we believe the GP length + # scale should reside in. They are used in additional half-cauchy + # prior to constraint these length scales. + + n_l = np.size(l_idx[0]) + # the number of parameters in the index of lower-triangular matrix + if rank is None: + rank = int((2 * n_C + 1 - + np.sqrt(n_C**2 * 4 + n_C * 4 + 1 - 8 * n_l)) / 2) + L = np.zeros([n_C, rank]) + L[l_idx] = L_l + + log_SNR2 = np.empty(n_V) + log_SNR2[0:n_V - 1] = param[0:n_V - 1] + log_SNR2[-1] = -np.sum(log_SNR2[0:n_V - 1]) + # This is following the restriction that SNR's have geometric mean + # of 1. That is why they are called pseudo-SNR. This restriction + # is imposed because SNR and L are determined only up to a scale + # Be cautious that during simulation, when there is absolute + # no signal in the data, sometimes the fitting diverges, + # presumably because we have created correlation between logS_NR2 + # due to the constraint. But I have not reproduced this often. + SNR2 = np.exp(log_SNR2) + # If requested, a GP prior is imposed on log(SNR). + deriv_log_SNR2 = np.zeros(np.shape(SNR2)) + # Partial derivative of log likelihood over log(SNR^2) + # dimension: space, + rho1 = 2.0 / np.pi * np.arctan(a1) + # AR(1) coefficient, dimension: space + YTAY = YTY_diag - rho1 * YTDY_diag + rho1**2 * YTFY_diag + XTAX = XTX[np.newaxis, :, :] - rho1[:, np.newaxis, np.newaxis] \ + * XTDX[np.newaxis, :, :] \ + + rho1[:, np.newaxis, np.newaxis]**2 * XTFX[np.newaxis, :, :] + # dimension: space*feature*feature + XTAY = XTY - rho1 * XTDY + rho1**2 * XTFY + # dimension: feature*space + LTXTAY = np.dot(L.T, XTAY) + # dimension: rank*space + LAMBDA_i = np.zeros([n_V, rank, rank]) + for i_v in range(n_V): + LAMBDA_i[i_v, :, :] = np.dot(np.dot(L.T, XTAX[i_v, :, :]), L) \ + * SNR2[i_v] + LAMBDA_i += np.eye(rank) + # dimension: space*rank*rank + LAMBDA = np.linalg.inv(LAMBDA_i) + # dimension: space*rank*rank + YTAXL_LAMBDA = np.einsum('ijk,ki->ij', LAMBDA, LTXTAY) + # dimension: space*rank + YTAXL_LAMBDA_LT = np.dot(YTAXL_LAMBDA, L.T) + # dimension: space*feature + sigma2 = (YTAY - SNR2 * np.sum(YTAXL_LAMBDA_LT * XTAY.T, axis=1))\ + / n_T + # dimension: space + + LL = -np.sum(np.log(sigma2)) * n_T * 0.5\ + + np.sum(np.log(1 - rho1**2)) * 0.5\ + - np.sum(np.log(np.linalg.det(LAMBDA_i))) * 0.5 - n_T * 0.5 + # Log likelihood of data given parameters, without the GP prior. + deriv_log_SNR2 = (-rank + np.trace(LAMBDA, axis1=1, axis2=2)) * 0.5\ + + YTAY / (sigma2 * 2.0) - n_T * 0.5 \ + - np.einsum('ij,ijk,ik->i', YTAXL_LAMBDA_LT, + XTAX, YTAXL_LAMBDA_LT)\ + / (sigma2 * 2.0) * (SNR2**2.0) + + if GP_space: + # Imposing GP prior on log(SNR) at least over + # spatial coordinates + c_space = param[n_V - 1] + l2_space = np.exp(c_space) + # The square of the length scale of the GP kernel defined on + # the spatial coordinates of voxels + dl2_dc_space = l2_space + # partial derivative of l^2 over b + + if GP_inten: + c_inten = param[n_V] + l2_inten = np.exp(c_inten) + # The square of the length scale of the GP kernel defined + # on the image intensity of voxels + dl2_dc_inten = l2_inten + # partial derivative of l^2 over b + K_major = np.exp(- (dist2 / l2_space + + inten_dist2 / l2_inten) + / 2.0) + else: + K_major = np.exp(- dist2 / l2_space / 2.0) + # The kernel defined over the spatial coordinates of voxels. + # This is a template: the diagonal values are all 1, meaning + # the variance of log(SNR) has not been multiplied + K_tilde = K_major + np.diag(np.ones(n_V) * self.epsilon) + # We add a small number to the diagonal to make sure the matrix + # is invertible. + # Note that the K_tilder here is still template: + # It is the correct K divided by the variance tau^2 + # So it does not depend on the variance of the GP. + L_K_tilde = np.linalg.cholesky(K_tilde) + inv_L_K_tilde = np.linalg.solve(L_K_tilde, np.identity(n_V)) + inv_K_tilde = np.dot(inv_L_K_tilde.T, inv_L_K_tilde) + log_det_K_tilde = np.sum(np.log(np.diag(L_K_tilde)**2)) + + invK_tilde_log_SNR = np.dot(inv_K_tilde, log_SNR2) / 2 + log_SNR_invK_tilde_log_SNR = np.dot(log_SNR2, + invK_tilde_log_SNR) / 2 + + tau2 = log_SNR_invK_tilde_log_SNR / n_V + + # GP prior terms added to the log likelihood + LL = LL - 0.5 - log_det_K_tilde / 2.0 \ + - n_V / 2.0 * np.log(tau2) - np.log(2 * np.pi) * n_V / 2.0 + + deriv_log_SNR2 -= invK_tilde_log_SNR / tau2 / 2 + + dK_tilde_dl2_space = dist2 * (K_major) / 2.0 \ + / l2_space**2 + dtau2_dl2_space = - np.dot(np.dot(invK_tilde_log_SNR.T, + dK_tilde_dl2_space), + invK_tilde_log_SNR) / n_V + deriv_c_space = \ + - n_V * 0.5 * dtau2_dl2_space * dl2_dc_space / tau2 \ + - 0.5 * np.sum(inv_K_tilde * dK_tilde_dl2_space) * dl2_dc_space + + # Prior on the length scales + LL += scipy.stats.halfcauchy.logpdf( + l2_space**0.5, scale=space_smooth_range) + deriv_c_space -= 2 * l2_space**0.5 / \ + (l2_space + space_smooth_range**2) * dl2_dc_space + + # Prior on the standar deviation of GP + LL += scipy.stats.halfcauchy.logpdf( + tau2**0.5, scale=self.tau_range) + deriv_c_space -= 2 * tau2**0.5 / \ + (tau2 + self.tau_range**2) * dtau2_dl2_space * dl2_dc_space + + if GP_inten: + dK_tilde_dl2_inten = inten_dist2 * K_major \ + / 2.0 / l2_inten**2 + dtau2_dl2_inten = - np.dot(np.dot(invK_tilde_log_SNR.T, + dK_tilde_dl2_inten), + invK_tilde_log_SNR) / n_V + deriv_c_inten = - n_V * 0.5 * dtau2_dl2_inten\ + * dl2_dc_inten / tau2 \ + - 0.5 * np.sum(inv_K_tilde * dK_tilde_dl2_inten)\ + * dl2_dc_inten + # Prior on the length scale + LL += scipy.stats.halfcauchy.logpdf( + l2_inten**0.5, scale=inten_smooth_range) + deriv_c_inten -= 2 * l2_inten**0.5 /\ + (l2_inten + inten_smooth_range**2) * dl2_dc_inten + # additional gradient due to prior on tau + deriv_c_inten -= 2 * tau2**0.5 / (tau2 + self.tau_range**2)\ + * dtau2_dl2_inten * dl2_dc_inten + deriv = np.zeros(np.size(param)) + deriv[0:n_V - 1] = deriv_log_SNR2[0:n_V - 1] - deriv_log_SNR2[n_V - 1] + if GP_space: + deriv[n_V - 1] = deriv_c_space + if GP_inten: + deriv[n_V] = deriv_c_inten + + return -LL, -deriv + + def _loglike_AR1_singpara(self, param, XTX, XTDX, XTFX, YTY_diag, + YTDY_diag, YTFY_diag, XTY, XTDY, XTFY, + l_idx, n_C, n_T, n_V, rank=None): + # In this version, we assume that beta is independent + # between voxels and noise is also independent. + # singpara version uses single parameter of sigma^2 and rho1 + # to all voxels. This serves as the initial fitting to get + # an estimate of L and sigma^2 and rho1. The SNR is inherently + # assumed to be 1. + LL = 0.0 + + n_l = np.size(l_idx[0]) + # the number of parameters in the index of lower-triangular matrix + + if rank is None: + rank = int((2 * n_C + 1 + - np.sqrt(n_C**2 * 4 + n_C * 4 + 1 - 8 * n_l)) / 2) + + L = np.zeros([n_C, rank]) + L[l_idx] = param[0:n_l] + + log_sigma2 = param[n_l] + sigma2 = np.exp(log_sigma2) + a1 = param[n_l + 1] + rho1 = 2.0 / np.pi * np.arctan(a1) + + XTAX = XTX - rho1 * XTDX + rho1**2 * XTFX + LAMBDA_i = np.eye(rank) +\ + np.dot(np.dot(np.transpose(L), XTAX), L) / sigma2 + + XTAY = XTY - rho1 * XTDY + rho1**2 * XTFY + LTXTAY = np.dot(L.T, XTAY) + + YTAY = YTY_diag - rho1 * YTDY_diag + rho1**2 * YTFY_diag + + LAMBDA_LTXTAY = np.linalg.solve(LAMBDA_i, LTXTAY) + L_LAMBDA_LTXTAY = np.dot(L, LAMBDA_LTXTAY) + + LL = LL + np.sum(LTXTAY * LAMBDA_LTXTAY) / (sigma2**2 * 2.0) \ + - np.sum(YTAY) / (sigma2 * 2.0) + + deriv_L = np.dot(XTAY, LAMBDA_LTXTAY.T) / sigma2**2 \ + - np.dot(np.dot(XTAX, L_LAMBDA_LTXTAY), + LAMBDA_LTXTAY.T) / sigma2**3 + + deriv_log_sigma2 = np.sum(YTAY) / (sigma2 * 2.0) \ + - np.sum(XTAY * L_LAMBDA_LTXTAY) / (sigma2**2) \ + + np.sum(np.dot(XTAX, L_LAMBDA_LTXTAY) + * L_LAMBDA_LTXTAY) / (sigma2**3 * 2.0) + + deriv_a1 = 2.0 / (np.pi * (1 + a1**2)) \ + * (-rho1 / (1 - rho1**2) + + np.sum((-XTDY + 2 * rho1 * XTFY) + * L_LAMBDA_LTXTAY) / (sigma2**2) + - np.sum(np.dot((-XTDX + 2 * rho1 * XTFX), L_LAMBDA_LTXTAY) + * L_LAMBDA_LTXTAY) / (sigma2**3 * 2.0) + - np.sum(-YTDY_diag + 2 * rho1 * YTFY_diag) / (sigma2 * 2.0)) + + LL = LL + np.size(YTY_diag) * (-log_sigma2 * n_T * 0.5 + + np.log(1 - rho1**2) * 0.5 + - np.log(np.linalg.det(LAMBDA_i)) + * 0.5) + + deriv_L = deriv_L - np.linalg.solve(LAMBDA_i, np.dot(L.T, XTAX)).T\ + / sigma2 * np.size(YTY_diag) + deriv_log_sigma2 = deriv_log_sigma2 \ + + (rank - n_T - np.trace(np.linalg.inv(LAMBDA_i)))\ + * 0.5 * np.size(YTY_diag) + deriv_a1 = deriv_a1 - np.trace( + np.linalg.solve(LAMBDA_i, + np.dot(np.dot(L.T, + (-XTDX + 2 * rho1 * XTFX)), L)))\ + / (sigma2 * 2) * np.size(YTY_diag) + + deriv = np.zeros(np.size(param)) + deriv[0:n_l] = deriv_L[l_idx] + deriv[n_l] = deriv_log_sigma2 + deriv[n_l + 1] = deriv_a1 + + return -LL, -deriv diff --git a/brainiak/utils/utils.py b/brainiak/utils/utils.py index 2f1087604..44b9bbc37 100644 --- a/brainiak/utils/utils.py +++ b/brainiak/utils/utils.py @@ -1,4 +1,4 @@ -# Copyright 2016 Intel Corporation +# Copyright 2016 Intel Corporation, Princeton University # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,6 +13,9 @@ # limitations under the License. import numpy as np import logging +import re +import warnings +import os.path """ Some utility functions that can be used by different algorithms @@ -49,7 +52,6 @@ def from_sym_2_tri(symm): """convert a 2D symmetric matrix to an upper triangular matrix in 1D format - Parameters ---------- @@ -71,6 +73,7 @@ def from_sym_2_tri(symm): def fast_inv(a): """to invert a 2D matrix + Parameters ---------- @@ -100,3 +103,164 @@ def fast_inv(a): except np.linalg.linalg.LinAlgError: logging.exception('Error from np.linalg.solve') raise + + +def cov2corr(cov): + """Calculate the correlation matrix based on a + covariance matrix + + Parameters + ---------- + + cov: 2D array + + Returns + ------- + + corr: 2D array + correlation converted from the covarince matrix + + + """ + assert cov.ndim == 2, 'covariance matrix should be 2D array' + inv_sd = 1 / np.sqrt(np.diag(cov)) + corr = cov * inv_sd[None, :] * inv_sd[:, None] + return corr + + +class ReadDesign: + """ A class which has the ability of reading in design matrix in .1D file, + generated by AFNI's 3dDeconvolve. + + Parameters + ---------- + + fname: string, the address of the file to read. + + include_orth: Boollean, whether to include "orthogonal" regressors in + the design matrix which are usually head motion parameters. All + the columns of design matrix are still going to be read in, but + the attribute cols_used will reflect whether these orthogonal + regressors are to be included for furhter analysis. + + include_pols: Boollean, whether to include polynomial regressors in + the design matrix which are used to capture slow drift of signals. + This will be reflected in the indices in the attribute cols_used. + + Attributes + ---------- + + design: 2d array. The design matrix read in from the csv file. + + n_col: number of total columns in the design matrix. + + column_types: 1d array. the types of each column in the design matrix. + 0 for orthogonal regressors (usually head motion parameters), + -1 for polynomial basis (capturing slow drift of signals), + values > 0 for stimulus conditions + + n_basis: scalar. The number of polynomial bases in the designn matrix. + + n_stim: scalar. The number of stimulus conditions. + + n_orth: scalar. The number of orthogoanal regressors (usually head + motions) + + StimLabels: list. The names of each column in the design matrix. + """ + def __init__(self, fname=None, include_orth=False, include_pols=False): + if fname is None: + # fname is the name of the file to read in the design matrix + self.design = np.zeros([0, 0]) + self.n_col = 0 + # number of columns (conditions) in the design matrix + self.column_types = np.ones(0) + self.n_basis = 0 + self.n_stim = 0 + self.n_orth = 0 + self.StimLabels = [] + else: + # isAFNI = re.match(r'.+[.](1D|1d|txt)$', fname) + filename, ext = os.path.splitext(fname) + # We assume all AFNI 1D files have extension of 1D or 1d or txt + if ext in ['.1D', '.1d', '.txt']: + self.read_afni(fname=fname) + + self.include_orth = include_orth + self.include_pols = include_pols + self.cols_used = np.where(self.column_types == 1)[0] + if self.include_orth: + self.cols_used = np.sort( + np.append(self.cols_used, np.where(self.column_types == 0)[0])) + if self.include_pols: + self.cols_used = np.sort(np.append( + self.cols_used, np.where(self.column_types == -1)[0])) + self.design_used = self.design[:, self.cols_used] + if not self.include_pols: + # baseline is not included, then we add a column of all 1's + self.design_used = np.insert(self.design_used, 0, 1, axis=1) + self.n_TR = np.size(self.design_used, axis=0) + + def read_afni(self, fname): + # Read design file written by AFNI + self.n_basis = 0 + self.n_stim = 0 + self.n_orth = 0 + self.StimLabels = [] + self.design = np.loadtxt(fname, ndmin=2) + with open(fname) as f: + all_text = f.read() + + find_n_column = re.compile( + r'^#[ ]+ni_type[ ]+=[ ]+"(?P\d+)[*]', re.MULTILINE) + n_col_found = find_n_column.search(all_text) + if n_col_found: + self.n_col = int(n_col_found.group('n_col')) + if self.n_col != np.size(self.design, axis=1): + warnings.warn( + 'The number of columns in the design matrix' + + 'does not match the header information') + self.n_col = np.size(self.design, axis=1) + else: + self.n_col = np.size(self.design, axis=1) + + self.column_types = np.ones(self.n_col) + # default that all columns are conditions of interest + + find_ColumnGroups = re.compile( + r'^#[ ]+ColumnGroups[ ]+=[ ]+"(?P.+)"', re.MULTILINE) + CG_found = find_ColumnGroups.search(all_text) + if CG_found: + CG_text = re.split(',', CG_found.group('CGtext')) + curr_idx = 0 + for CG in CG_text: + split_by_at = re.split('@', CG) + if len(split_by_at) == 2: + # the first tells the number of columns in this condition + # the second tells the condition type + n_this_cond = int(split_by_at[0]) + self.column_types[curr_idx:curr_idx + n_this_cond] = \ + int(split_by_at[1]) + curr_idx += n_this_cond + elif len(split_by_at) == 1 and \ + not re.search('..', split_by_at[0]): + # Just a number, and not the type like '1..4' + self.column_types[curr_idx] = int(split_by_at[0]) + curr_idx += 1 + else: # must be a single stimulus condition + split_by_dots = re.split('\..', CG) + n_this_cond = int(split_by_dots[1]) + self.column_types[curr_idx:curr_idx + n_this_cond] = 1 + curr_idx += n_this_cond + self.n_basis = np.sum(self.column_types == -1) + self.n_stim = np.sum(self.column_types > 0) + self.n_orth = np.sum(self.column_types == 0) + + find_StimLabels = re.compile( + r'^#[ ]+StimLabels[ ]+=[ ]+"(?P.+)"', re.MULTILINE) + StimLabels_found = find_StimLabels.search(all_text) + if StimLabels_found: + self.StimLabels = \ + re.split(r'[ ;]+', StimLabels_found.group('SLtext')) + else: + self.StimLabels = [] diff --git a/requirements-dev.txt b/requirements-dev.txt index 37097bf57..b8a7824f2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,6 +1,7 @@ coverage flake8 flake8-print +numdifftools pytest restructuredtext-lint sphinx diff --git a/tests/reprsimil/example_design.1D b/tests/reprsimil/example_design.1D new file mode 100755 index 000000000..7385edea6 --- /dev/null +++ b/tests/reprsimil/example_design.1D @@ -0,0 +1,272 @@ +# + 1 -1.0000000112159 0.99459451576695 -0.99999999935909 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0067129032686353 0.010406452231109 -0.009523656219244 -0.050046753138304 0.00098924792837352 0.014952690340579 + 1 -0.98918920040512 0.9623373937801 -0.93600852797536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.0085870968177915 -0.0038935476914048 -0.010923656169325 0.019553247839212 0.0039892479544505 -0.20644730236381 + 1 -0.97837838959431 0.93043089268441 -0.87375120856684 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.030487096868455 0.1236064536497 -0.040723655372858 -0.054246752988547 -0.0075107525335625 -0.0066473102197051 + 1 -0.9675675787835 0.89887501247988 -0.81320908865291 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.067987094633281 0.064706451259553 -0.047223657369614 0.010453246533871 -0.024510751594789 0.085652687586844 + 1 -0.95675676797268 0.86766975316651 -0.75436321575299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.067487093620002 0.11460645031184 -0.074723657220602 -0.12964675202966 -0.030410750885494 0.30405268166214 + 1 -0.94594595716187 0.8368151147443 -0.69719463738645 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.027775989845395 -0.099387097172439 0.11130645405501 -0.059223655611277 -0.0059467516839504 -0.010510752093978 0.0095526902005076 + 1 -0.93513514635106 0.80631109721326 -0.64168440107271 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.14959700405598 -0.089187095873058 0.15680645685643 -0.070323657244444 -0.050846753118094 -0.0029107519658282 0.14565269742161 + 1 -0.92432433554025 0.77615770057338 -0.58781355433115 0 0 0 0 0 0.037642534822226 0 0 0 0 0 0 0 0 0 0 0.12429390102625 -0.083387094549835 0.12480645161122 -0.054423656314611 -0.050246753133251 0.013389248284511 0.11435268912464 + 1 -0.91351352472944 0.74635492482465 -0.53556314468118 0 0 0 0 0 0.12830232083797 0 0 0 0 0 0 0 0 0 0 0.049149610102177 -0.062687094323337 0.13770644646138 -0.042223654687405 -0.046746753156185 0.018289248342626 0.072352689690888 + 1 -0.90270271391863 0.71690276996709 -0.48491421964219 0 0 0 0 0 0.17503398656845 0 0 0 0 0 0 0 0 0 0 0.0058261859230697 -0.045587095431983 0.2022064505145 -0.047923658043146 -0.12844675406814 0.016089248354547 0.16415269766003 + 1 -0.89189190310782 0.6878012360007 -0.43584782673358 0.00055640988284722 0 0 0 0 0.12353418022394 0 0 0 0 0 0 0 0 0 0 -0.011150837875903 -0.056987094692886 0.12560645025223 -0.06052365526557 -0.073546752333641 0.0068892481504008 -0.025347310118377 + 1 -0.88108109229701 0.65905032292546 -0.38834501347474 0.085981301963329 0 0 0 0 0.043058145791292 0 0 0 0 0 0 0 0 0 0 -0.0138487406075 0.029312903992832 -0.087693546898663 -0.014023656025529 0.021853249520063 -0.022210751776583 -0.050747311674058 + 1 -0.8702702814862 0.63065003074138 -0.34238682738507 0.13706742227077 0 0 0 0 -0.0014883950352669 0 0 0 0 0 0 0 0 0.00446742400527 0 -0.010243398137391 0.030112902633846 -0.098093544133008 -0.025723656639457 0.082353252917528 -0.023310751770623 -0.20704731252044 + 1 -0.85945947067539 0.60260035944847 -0.29795431598397 0.074951887130737 0 0 0 0 -0.016573801636696 0 0 0 0 0 0 0 0 0.13216799497604 0 -0.0057357279583812 0.043912903405726 -0.12029355484992 -0.026223655790091 0.087853241711855 0.0078892478486523 -0.07564730849117 + 1 -0.84864865986458 0.57490130904671 -0.25502852679083 0.020650556311011 0 0 0 0 -0.016711676493287 0 0.064530149102211 0 0 0 0 0 0 0.16308039426804 0 -0.0026250404771417 0.069412906654179 -0.029693548567593 -0.015923656057566 -0.02844675257802 0.027189248125069 0.088752687908709 + 1 -0.83783784905377 0.54755287953612 -0.21359050732505 -0.0044987495057285 0 0 0 0 -0.011434393003583 0 0.20859688520432 0 0 0 0 0 0 0.07964064925909 0 0 0.029712903313339 0.11960645299405 -0.00012365635484457 -0.19364675506949 0.012089247698896 0.15545268449932 + 1 -0.82702703824295 0.52055507091669 -0.17362130510603 -0.012204987928271 0 0 0 0 -0.0061583844944835 0 0.24455913901329 0 0 0 0 0 0 0.018422532826662 0 0 0.013712903484702 0.10110645275563 -0.00042365584522486 -0.062646753154695 0.0082892481004819 0.024252690374851 + 1 -0.81621622743214 0.49390788318842 -0.13510196765317 -0.011045500636101 0 0 0 0 -0.0020890964660794 0 0.26294341683388 0 0 0 0 0 0 -0.0083925630897284 0 0 0.01411290327087 0.092506448738277 0.0008763438090682 -0.053346753120422 -0.0057107518659905 -0.13064731564373 + 1 -0.80540541662133 0.46761131635132 -0.098013542485854 -0.0070121213793755 0 0 0 0 0 0 0.20453441143036 0 0 0 0 0 0 -0.015550730749965 0 0 0.025512902997434 0.13680644612759 0.0012763440608978 -0.14484675601125 -0.0033107522176579 0.010352690238506 + 1 -0.79459460581052 0.44166537040537 -0.062337077123487 -0.0035262261517346 0 0 0 0 0 0 0.19082318246365 0 0 0 0 0 0 -0.01305516064167 0 0 0.022012903355062 0.15430645924062 0.006576344370842 -0.14244675263762 0.0068892481504008 0.073352691717446 + 1 -0.78378379499971 0.41607004535059 -0.028053619085463 -0.0014841681113467 0 0 0 0 0 0 0.21973279118538 0 0 0 0 0 0 -0.0079289497807622 0 0 0.01741290371865 0.040706452913582 0.0064763445407152 -0.052846753038466 0.00058924793847837 0.0023526903241873 + 1 -0.7729729841889 0.39082534118696 0.0048557841088193 0 0 0 0 0 0 0 0.16675978899002 0 0 0 0 0 0 -0.0038589551113546 0 0 -0.0357870971784 -0.13709354121238 -0.022623656317592 0.030053246766329 -0.017310752649792 -0.0009473105892539 + 1 -0.76216217337809 0.3659312579145 0.036410084939965 0 0 0 0 0 0 0 0.18963772058487 0 0 0 0 0 0 0 0 0 -0.024887095205486 -0.13729354459792 -0.045723658055067 0.063253249973059 -0.003910752129741 -0.030147309415042 + 1 -0.75135136256728 0.3413877955332 0.066628235888576 0 0 0 0 0 0 0 0.15496288239956 0 0 0 0 0 0 0 0 0 -0.011787096969783 -0.19019354600459 -0.030823655426502 0.10135324671865 0.017589247669093 -0.20194731559604 + 1 -0.74054055175647 0.31719495404306 0.095529189435256 0 0 6.292293255683e-05 0 0 0 0 0.17730142176151 0 0 0 0 0 0 0 0 0 -0.015487096272409 -0.17039355356246 -0.030923657119274 0.12055324390531 0.014289247686975 -0.15214730706066 + 1 -0.72972974094566 0.29335273344408 0.12313189806061 0 0 0.095935180783272 0 0 0 0 0.12749932706356 0 0 0 0 0 0 0 0 0 0.034612902440131 0.1443064538762 0.0044763442128897 -0.13524674996734 -0.022810752619989 0.2602526852861 + 1 -0.71891893013485 0.26986113373627 0.14945531424524 0 0 0.19222097098827 0 0 0 0 0.036020509898663 0 0 0 0 0 0 0 0 0 0.03431290294975 0.077506455592811 0.0023763440549374 -0.011446751654148 -0.02061075263191 0.042452690191567 + 1 -0.70810811932404 0.24672015491961 0.17451839046975 0 0 0.11517268419266 0 0 0 0 -0.012899462133646 0.047586746513844 0 0 0 0 0 0 0 0 0.0031129033304751 -0.11499355453998 0.007476344704628 0.12395324185491 -0.0040107519598678 -0.13654731120914 + 1 -0.69729730851323 0.22392979699412 0.19834007921474 0 0 0.035251531749964 0 1.7466900317231e-06 0 0 -0.025363964959979 0.17251434922218 0 0 0 0 0 0 0 0 -0.00048709660768509 -0.16689355392009 -0.008623656234704 0.1636532433331 0.00328924797941 -0.26004731561989 + 1 -0.68648649770241 0.20149005995979 0.22093933296081 0 0 -0.0034804616589099 0 0.058831561356783 0 0 -0.021560948342085 0.1271647810936 0 0 0 0 0 0 0 0 -0.0016870964318514 -0.099493545480072 0.0053763436153531 0.046653244644403 0.0083892479306087 0.076252688653767 + 1 -0.6756756868916 0.17940094381662 0.24233510418858 0 0 -0.016322674229741 0 0.15306103229523 0 0 -0.014806993305683 0.046425126492977 0 0 0 0 0 0 0 0 0.0041129032615572 -0.1288935514167 0.0052763437852263 0.10215324535966 0.013489248114638 -0.063347308896482 + 1 -0.66486487608079 0.15766244856461 0.26254634537864 0 0 -0.015743028372526 0 0.22671715915203 0 0 -0.0065927244722843 0.0028545362874866 0 0 0 0 0 0 0 0 -0.0088870963081717 -0.06669354904443 -0.0042236563749611 0.062953244894743 0.0053892479045317 -0.028147309087217 + 1 -0.65405406526998 0.13627457420376 0.28159200901159 0 0 -0.010351501405239 0 0.21719300746918 0 0 -0.0031336443498731 -0.013423582538962 0 0 0 0 0 0 0 0 -0.0025870967656374 -0.10389354545623 -0.0022236560471356 0.034853246062994 0.014289247686975 -0.067447311244905 + 1 -0.64324325445917 0.11523732073408 0.29949104756804 0 0 -0.0053398911841214 0 0.18410536646843 0 0 0 -0.015115818940103 0 0 0 0 0 0 0 0 -0.01188709679991 -0.087793548591435 0.0061763431876898 0.040753249078989 -0.0085107517661527 0.015252690354828 + 1 -0.63243244364836 0.094550688155553 0.3162624135286 0 0 -0.0022931022103876 0 0.17885300517082 0 0 0 -0.010725096799433 0 0 0 0 0 0 0 0 -0.0017870971933007 -0.059793551452458 0.0063763447105885 0.015653248876333 -0.018010751460679 0.079052687622607 + 1 -0.62162163283755 0.07421467646819 0.33192505937386 0 0 0 0 0.16898131370544 0 0 0 -0.005837693810463 0 0 0 0 0 0 0 0 -0.0010870965197682 -0.1001935498789 0.010876344516873 0.028153244405985 8.924794383347e-05 -0.035947310738266 + 1 -0.61081082202674 0.054229285671989 0.34649793758443 0 0 0 0 0.14792582392693 0 0 0 -0.0026140084955841 0 0 0 0 0 0 0 0 -0.015187096782029 -0.1052935468033 0.0063763447105885 0.056053247302771 0.003689247998409 -0.019047311507165 + 1 -0.60000001121593 0.034594515766948 0.36000000064091 0 0 0 0 0.12118621170521 0 0 0 0 0 0 0 0 0 0 0 0 -0.0023870971053839 -0.094993551261723 0.015476344153285 0.02055324986577 -0.0034107520477846 0.099752687849104 + 1 -0.58918920040512 0.01531036675307 0.37245020102391 0 0.0016005024081096 0 0 0.12434333562851 0 0 0 0 0 0 0 0 0 0 0 0 -0.015487096272409 -0.11449354607612 0.0011763442307711 0.074553247541189 -0.0011107519967481 -0.027947309426963 + 1 -0.57837838959431 -0.0036231613696476 0.38386749121403 0 0.096228934824467 0 0 0.054626442492008 0 0 0 0 0 0 0 0 0 0 0 0 0.018212903290987 -0.08299354929477 0.015376344323158 0.0053532458841801 0.00078924793342594 0.028352689929307 + 1 -0.5675675787835 -0.022206068601203 0.39427082369186 0 0.13414172828197 0 0 0.0015350170433521 0 0 0 0 0 0 0 0 1.3503349691746e-05 0 0 0 0.012112903408706 -0.099593547172844 0.012776343151927 0.0025532469153404 0.0090892481384799 -0.10724730696529 + 1 -0.55675676797268 -0.040438354941598 0.40367915093803 0 0.069246374070644 0 0 -0.018672101199627 0 0 0 0 0 0 0 0 0.072324976325035 0 0 0 0.0093129032757133 -0.038593546487391 0.010976344347 -0.0063467547297478 0.0104892476229 0.028652690351009 + 1 -0.54594595716187 -0.058320020390831 0.41211142543312 0 0.017592553049326 0 0.014113682322204 -0.019757304340601 0 0 0 0 0 0 0 0 0.15773610770702 0 0 0 0.0073129032971337 -0.064593550749123 0.015476344153285 0.036053244024515 0.0092892477987334 -0.10364731308073 + 1 -0.53513514635106 -0.075851064948903 0.41958659965775 0 -0.0056622386910021 0 0.12503287196159 -0.013525931164622 0 0 0 0 0 0 0 0 0.097588993608952 0 0 0 0.012712903320789 -0.0035935482010245 0.0058763436973095 -0.023246753960848 -0.0033107522176579 0.025152690708637 + 1 -0.52432433554025 -0.093031488615813 0.42612362609251 0 -0.012351076118648 0 0.11872909218073 -0.0082509722560644 0 0 0 0 0 0 0.012349472381175 0 0.030836544930935 0 0 0 0.016412903554738 -0.037193548865616 0.01207634434104 0.019053246825933 -0.0079107518540695 -0.10244730766863 + 1 -0.51351352472944 -0.10986129139156 0.43174145721801 0 -0.010752606205642 0 0.050772178918123 -0.0035070178564638 0 0 0 0 0 0 0.1094037592411 0 -0.0020397072657943 0 0 0 0.017712903209031 0.030806452967227 0.0045763440430164 -0.016246754676104 -0.011410752427764 0.01055269036442 + 1 -0.50270271391863 -0.12634047327615 0.43645904551486 0 -0.0066744363866746 0 0.0084341736510396 -0.0015163091011345 0.04815686494112 0 0 0 0 0 0.10388795286417 0 -0.01319295912981 0 0 0 0.023812904022634 -0.030193549580872 0.012576343491673 0.026353243738413 -0.0029107519658282 -0.13134731259197 + 1 -0.49189190310782 -0.14246903426957 0.44029534346365 0 -0.0033013850916177 0 -0.0088908206671476 0 0.13978426158428 0 0 0 0 0 0.044425655156374 0 -0.013019875623286 0 0 0 0.025112903676927 0.036006451584399 0.00097634363919497 -0.051846753107384 0.011489247786812 0.041552689857781 + 1 -0.48108109229701 -0.15824697437184 0.44326930354498 0 -0.0013714701635763 0 -0.012442322447896 0 0.13858208060265 0 0 0 0 0 0.0073799015954137 0 -0.0086652403697371 0 0 0 0.021412903442979 -0.0093935476616025 0.01237634383142 0.044653248041868 0.013189247692935 -0.1755473157391 + 1 -0.4702702814862 -0.17367429358294 0.44539987823947 0.0030656999442726 0 0 -0.0096218045800924 0 0.18833549320698 0 0 0 0 0 -0.0077794678509235 0 -0.0045090229250491 0 0 0 0.022612904198468 -0.014093547128141 0.0094763431698084 0.061953250318766 -0.0081107524456456 -0.16874730493873 + 1 -0.45945947067539 -0.18875099190288 0.44670602002772 0.12636050581932 0 0 -0.0055486336350441 0 0.11498866230249 0 0 0 0 0 -0.010887031443417 0 -0.0019495403394103 0 0 0 0.040712905116379 0.071606452576816 0.0063763447105885 -0.038346753455698 -0.0038107522996143 -0.03504731040448 + 1 -0.44864865986458 -0.20347706933166 0.44720668139032 0.16548715531826 0 0 -0.0025971501599997 0 0.030592679977417 0 0 0 0 0 -0.0084190787747502 0 0 0.053775411099195 0 0 0.020712903700769 0.052206452004611 0.0067763440310955 -0.020446753129363 -0.0027107520727441 0.13395269308239 + 1 -0.43783784905377 -0.21785252586928 0.44692081480789 0.083070278167725 0 0.00069552229251713 0 0 -0.0093372892588377 0 0 0 0 0 -0.0048550544306636 0 0 0.17381578683853 0 0 0.023612902499735 0.031806453131139 0.0089763440191746 0.01885324344039 -0.0023107520537451 0.0600526900962 + 1 -0.42702703824295 -0.23187736151574 0.44586737276102 0.020175436511636 0 0.10747677832842 0 0 -0.020309561863542 0 0 0 0 0 -0.0022725064773113 0 0 0.12343865633011 0 0 0.054112904705107 0.063506453298032 0.013076344504952 -0.10814675316215 -0.00681075186003 0.09105268958956 + 1 -0.41621622743214 -0.24555157627104 0.44406530773032 -0.0077522136271 0 0.17133423686028 0 0 -0.018001658841968 0 0 0 0 0.00055644899839535 0 0 0 0.043845765292645 0 0 0.05091290269047 0.047706454060972 0.011776342988014 -0.072146752849221 0.0052892480744049 -0.058047308586538 + 1 -0.40540541662133 -0.25887517013517 0.4415335721964 -0.015503321774304 0 0.093689776957035 0 0 -0.011593883857131 0 0 0 0 0.085981898009777 0 0 0 0.0017423888202757 0 0 0.063712903298438 0.080906453542411 -0.001023655757308 -0.16354675218463 0.0059892478166148 0.03335269074887 + 1 -0.39459460581052 -0.27184814310814 0.43829111863984 -0.013250176794827 0 0.025813156738877 0 0 -0.0052539245225489 0 0 0 0 0.13706727325916 0 0 0 -0.013717586174607 0 0 0.062212903983891 0.095306451432407 -0.00042365584522486 -0.17324675247073 -0.001310752122663 -0.022447309456766 + 1 -0.38378379499971 -0.28447049518995 0.43435689954127 -0.008134912699461 0 -0.0056234514340758 0 0 0.006489459425211 0 0 0 0 0.074951559305191 0 0 0 -0.015004207380116 0 0 0.051512901671231 0.058706454001367 0.0025763437151909 -0.10944675281644 -0.011610752088018 -0.15204730536789 + 1 -0.3729729841889 -0.2967422263806 0.42974986738128 -0.0039911866188049 0 -0.015256236307323 0 0 0.11816956847906 0 0 0 0 0.020650375634432 0 0 0 -0.010505273938179 0 0 0.053812903352082 0.1143064526841 -0.011323656188324 -0.19274675473571 -0.012810751912184 0.055052691139281 + 1 -0.36216217337809 -0.30866333668009 0.42448897464048 0 0 -0.013806872069836 0 0 0.12816107273102 0 0 0 0 -0.0044988198205829 0 0 0 -0.0056656016968191 0 0 0.045312904752791 0.049706450663507 0.0063763447105885 -0.060146752744913 0.004089248017408 0.00065269041806459 + 1 -0.35135136256728 -0.32023382608842 0.41859317379946 0 0 -0.008765147998929 0 0 0.15216007828712 0 0 0 0 -0.012204997241497 0 0 0 -0.0025189006701112 0 0 0.041512903757393 0.10200645308942 0.0028763441368937 -0.084046754986048 -0.0025107521796599 0.19385269377381 + 1 -0.34054055175647 -0.33145369460559 0.41208141733884 0.00042675601434894 0 -0.0044077797792852 0 0 0.12315040826797 0 0 0 0 -0.011045484803617 0 0 0 0 0 0 0.043612902052701 0.092406454496086 0.0044763442128897 -0.044746753294021 -0.016510752146132 0.060752690769732 + 1 -0.32972974094566 -0.34232294223159 0.40497265773921 0.12098247557878 0 -0.001855208654888 0 0 0.045295763760805 0 0 0 0 -0.0070121022872627 0 0 0 0 0 0 0.047312905080616 0.0077064521610737 0.011176344007254 0.020053248852491 -0.019710752298124 -0.024547311477363 + 1 -0.31891893013485 -0.35284156896643 0.39728584748118 0.20731872320175 0 0 0 0 -0.00076612085103989 0 0 0 0 -0.0035262131132185 0 0.017642103135586 0 0 0 0 0.04471290204674 0.050606450997293 0.006076343357563 -0.032946752384305 -0.0031107520917431 0.017152690328658 + 1 -0.30810811932404 -0.36300957481012 0.38903993904535 0.11678945273161 0 0 0 0 -0.01625781878829 0 0 0 0 -0.0014841614756733 0 0.15629108250141 0 0 0 0 0.055312902666628 0.081206451170146 0.005676344037056 -0.071046752855182 -0.001310752122663 0.070552689023316 + 1 -0.29729730851323 -0.37282695976264 0.38025388491233 0.033387824892998 0 0 0 0 -0.016767358407378 0.028632424771786 0 0 0 0 0 0.14841136336327 0 0 0 0 0.052412902005017 0.038706452585757 0.01857634447515 -0.032746752724051 -0.0019107520347461 -0.017247310839593 + 1 -0.28648649770241 -0.38229372382399 0.37094663756271 -0.0058099492453039 0 0 0 0 -0.011784705333412 0.17964339256287 0 0 0 0 0 0.063465222716331 0 0 0 0 0.048512903042138 0.039306451566517 0.0098763443529606 -0.030746752396226 0.005889247986488 -0.020847308449447 + 1 -0.2756756868916 -0.39140986699419 0.36113714947711 -0.018164224922657 0 0 0 0 -0.005407671444118 0.15981185436249 0 0 0 0 0 0.010542716830969 0 0 0 0 0.053912905044854 0.058206452988088 0.0033763442188501 -0.060346753336489 0.0084892477607355 0.01635269029066 + 1 -0.26486487608079 -0.40017538927323 0.35084437313612 -0.016777858138084 0 0 0 0 -0.0026109907776117 0.18218821287155 0 0 0 0 0 -0.011113525368273 0 0 0 0 0.045912903733552 0.074306453578174 -0.0034236563369632 -0.05854675360024 0.016989248688333 0.071852688677609 + 1 -0.25405406526998 -0.4085902906611 0.34008726102035 -0.010774576105177 0 0 0 0 0 0.17693194746971 0 0 0 0 0 -0.015552902594209 0 0 0 0 0.04131290409714 0.071206453256309 0.0021763434633613 -0.045946753118187 -0.0020107520977035 0.024952690117061 + 1 -0.24324325445917 -0.41665457115781 0.32888476561041 -0.0054639861918986 0 0 0 0 0 0.17483820021152 0 0 0 0 0 -0.012027255259454 0 0 0 0 0.039012902416289 0.069406452588737 -0.001923656091094 -0.024946752935648 -0.003910752129741 -0.0061473092064261 + 1 -0.23243244364836 -0.42436823076337 0.31725583938689 -0.0023150618653744 0 0 0 0 0 0.12542612850666 0 0 0 0 0 -0.0069357920438051 0 0 0 0 0.035812904126942 0.060206453315914 0.0042763436213136 0.026653248816729 0.00018924794858322 -0.099747306667268 + 1 -0.22162163283755 -0.43173126947776 0.3052194348304 0 0 0 0 0 0 0.13749043643475 0 0 0 0 0 -0.0032464377582073 0 0 0 0 0.029112902469933 0.11720644962043 0.0043763434514403 0.0016532465815544 0.0012892479426228 0.0097526903264225 + 1 -0.21081082202674 -0.43874368730098 0.29279450442154 0 0 0 0 0 0 0.14846354722977 0 0 0 0 0 0 0 0 0 0 0.031112902797759 0.03860645275563 0.014176344498992 0.043153245002031 -0.0030107522616163 -0.070447309873998 + 1 -0.20000001121593 -0.44540548423305 0.28000000064091 0 0 0 0 0 0 0.19279418885708 0 0 0 0 0 0 0 0 0 0 0.022912903688848 0.10360645037144 0.0073763430118561 0.010053247213364 0.00078924793342594 0.13845268730074 + 1 -0.18918920040512 -0.45171666027396 0.26685487596912 0 0 0 0 0 0 0.21137630939484 0 0 0 0 0 0 0 0 0 0 0.015312903560698 0.082306454889476 0.0033763442188501 0.041253250092268 0.004089248017408 0.18055269215256 + 1 -0.17837838959431 -0.4576772154237 0.25337808288678 0 0 0 0.043020330369473 0 0 0.14208625257015 0 0 0 0 0 0 0 0 0 0 0.0055129032116383 0.077706451527774 -0.0071236561052501 -0.037946753203869 0.0025892478879541 0.2391526857391 + 1 -0.1675675787835 -0.46328714968228 0.23958857387448 0 0 0 0.13905262947083 0 0 0.041933041065931 0 0 0 0 0 0 0 0 0 0 0.023912903852761 0.15820645075291 -0.025423657149076 -0.1429467536509 0.0025892478879541 0.15375268552452 + 1 -0.15675676797268 -0.46854646304971 0.22550530141283 0 0 0 0.098750926554203 0 0 -0.012082259170711 0 0 0.018220633268356 0 0 0 0 0 0 0 0.011012903414667 0.10640645306557 -0.010123656247742 -0.062346752732992 -0.0088107521878555 -0.021447311155498 + 1 -0.14594595716187 -0.47345515552597 0.21114721798243 0 0 0 0.03507661446929 0 0 -0.026482511311769 0 0 0.11431851238012 0 0 0 0 0 0 0 -0.011787096969783 -0.048293546773493 0.00067634414881468 0.074753243476152 -0.0072107521118596 -0.055747306905687 + 1 -0.13513514635106 -0.47801322711106 0.19653327606389 0 0.017292505130172 0 0.0013939110795036 0 0 -0.024222373962402 0 0 0.099139772355556 0 0 0 0 0 0 0 -0.0036870967596769 -0.067493547685444 0.0023763440549374 0.068653244525194 -0.010410752263851 -0.10984730627388 + 1 -0.12432433554025 -0.482220677805 0.1816824281378 0 0.12800069153309 0 -0.01097406912595 0 0 -0.015291653573513 0 0 0.04024151340127 0 0 0 0 0 0 0 0.016112903133035 -0.025893547572196 0.00077634397894144 -0.031946752220392 -0.024710751255043 0.090352692641318 + 1 -0.11351352472944 -0.48607750760778 0.16661362668478 0 0.11605546623468 0 -0.012003365904093 0 0 -0.0082694683223963 0 0 0.0054445695132017 0 0 0 0 0 0.0059029059484601 0 -0.016587096266448 -0.076993544586003 0.012976344674826 0.1091532446444 -0.021610752795823 -0.16014730837196 + 1 -0.10270271391863 -0.48958371651939 0.15134582418542 0 0.048352032899857 0 -0.0084042195230722 0 0 -0.0028834280092269 0 0 -0.0083946632221341 0 0 0 0 0 0.10000795125961 0 -0.02848709654063 -0.032693547196686 0.0011763442307711 0.096353251487017 0.0047892479924485 -0.094947307370603 + 1 -0.09189190310782 -0.49273930453984 0.13589797312033 0 0.0073072644881904 0.004996741656214 -0.0045324815437198 0 0 0 0 0 -0.010818615555763 0 0 0 0 0 0.11038105934858 0 -0.03128709550947 -0.040093549527228 0.0051763439550996 0.11825324967504 0.0080892479745671 -0.25064730551094 + 1 -0.081081092297009 -0.49554427166914 0.12028902597011 0 -0.009253709577024 0.11014425009489 -0.0020151205826551 0 0 0 0 0 -0.0081188511103392 0 0 0 0 0 0.051077321171761 0 -0.028087097220123 0.020306452177465 -0.0021236562170088 0.028753247112036 -0.019210751284845 0.077652693726122 + 1 -0.070270281486198 -0.49799861790727 0.10453793521537 0 -0.012408400885761 0.12837927043438 0 0 0 0 0 0.0099470904096961 -0.004590333905071 0 0 0 0 0 0.010568294674158 0 -0.039187095128 -0.094093550927937 0.0050763441249728 0.22715326026082 -0.021210751612671 -0.30834731366485 + 1 -0.059459470675387 -0.50010234325423 0.088663653336703 0 -0.0094509832561016 0.061017215251923 0 1.7468818214184e-06 0 0 0 0.1329403668642 -0.0021164785139263 0 0 0 0 0 -0.0067023267038167 0 -0.033887098543346 0.002206452190876 0.0094763431698084 0.092953253537416 0.002489247941412 -0.019747308455408 + 1 -0.048648659864576 -0.50185544771004 0.07268513281472 0 -0.0053962054662406 0.013384091667831 0 0.058831807225943 0 0 0 0.13926292955875 0 0 0 0 0 0 -0.010917749255896 0 -0.044387097470462 -0.085793544538319 0.0021763434633613 0.14515324309468 -0.004710752167739 -0.266447304748 + 1 -0.037837849053766 -0.50325793127469 0.056621326130022 0 -0.0025067001115531 -0.0071999179199338 0 0.14035293459892 0 0 0 0.062757529318333 0 0 0 0 0 0 -0.0088573601096869 0 -0.019987096078694 0.0048064524307847 0.0029763439670205 0.027753245085478 -0.0056107520358637 0.03505268972367 + 1 -0.027027038242955 -0.50430979394817 0.040491185763213 0 0.053441412746906 -0.012465350329876 0 0.089743755757809 0 0 0 0.012170788832009 0 0 0 0 0 0 -0.0052667763084173 0 -0.026087096892297 -0.04249354917556 0.0045763440430164 0.039753247052431 -0.019710752298124 -0.044147307984531 + 1 -0.016216227432144 -0.50501103573049 0.024313664194895 0 0.14021460711956 -0.010284850373864 0 0.029239932075143 0 0 0 -0.0091062942519784 0 0 0 0 0.0018005651654676 0 -0.0025229994207621 0 -0.039087097160518 -0.041293547488749 0.005676344037056 0.12005325034261 -0.015110752661712 -0.17924730386585 + 1 -0.0054054166213331 -0.50536165662166 0.0081077139056723 0 0.092748634517193 -0.0061801802366972 0 -0.0010622846893966 0 0 0 -0.014036962762475 0 0 0 0 0.10825754702091 0 0 0 -0.02738709654659 0.0081064521800727 0.00407634396106 0.039853248745203 -0.025110752438195 -0.0091473096981645 + 1 0.0054053941894776 -0.50536165662166 -0.008107712623852 0 0.031126981601119 -0.0029839819762856 0 -0.011565917171538 0 0.028552377596498 0 -0.011202690191567 0 0 0 0 0.15090943872929 0 0 0 -0.03188709821552 -0.042693548835814 0.0083763431757689 0.05095325037837 0.0030892478534952 0.014852690343105 + 1 0.016216205000289 -0.50501103573049 -0.024313662913075 0 -0.00027817318914458 0 0 -0.011690891347826 0 0.10350869596004 0 -0.0065927179530263 0 0 0 0 0.077902160584927 0 0 0 -0.065387095324695 -0.029893548227847 -0.011423656251281 0.11095324531198 0.010989247704856 0.1039526918903 + 1 0.027027015811099 -0.50430979394817 -0.040491184481393 0 -0.011387062259018 0 0.017292505130172 -0.007877248339355 0 0.076298668980598 0 -0.0031336380634457 0 0 0 0 0.01979162171483 0 0 0 -0.054587095044553 -0.038393546827137 -0.0098236562334932 0.07965325191617 0.0057892481563613 0.071052690036595 + 1 0.03783782662191 -0.50325793127469 -0.056621324848202 0 -0.011802065186203 0 0.12800069153309 -0.0041351648978889 0 0.027854926884174 0 0 1.9652418359328e-06 0 0 0 -0.0063700182363391 0 0 0 -0.047287098132074 -0.025793549604714 -0.0038236561231315 0.066753249615431 0.004089248017408 0.1022526929155 + 1 0.048648637432721 -0.50185544771004 -0.0726851315329 0 -0.008052596822381 0 0.11605546623468 -0.0018002366414294 0 0.0017126569291577 0 0 0.066185779869556 0 0 0 -0.013894959352911 0 0 0 -0.065787094645202 -0.0054935486987233 -0.016723656095564 0.030953247100115 -0.0070107524516061 0.095652692951262 + 1 0.059459448243532 -0.50010234325423 -0.088663652054883 0 -0.0028645200654864 0 0.048352032899857 0 0 -0.0080541670322418 0 0 0.15789704024792 0 0 0 -0.012096680700779 0 0 0 -0.051787096075714 -0.030793548561633 -0.014523656107485 0.094953242689371 -0.0089107520179823 -0.056247307918966 + 1 0.070270259054343 -0.49799861790727 -0.10453793393355 0 0.082330644130707 0 0.0073072644881904 0 0 -0.0090694855898619 0 0 0.10096172243357 0 0 0 -0.007508740760386 0 0 0 -0.048587097786367 0.04140645172447 -0.0070236562751234 -0.040346752852201 -0.029810751904733 0.063552689738572 + 1 0.081081069865153 -0.49554427166914 -0.12028902468829 0 0.11737401038408 0 -0.009253709577024 0 0 -0.0064350459724665 0 0 0.032894920557737 0 0 0 -0.0037140580825508 0 0.014120560139418 0 -0.046387097798288 -0.042093546129763 -0.0041236560791731 0.059353243559599 -0.010510752093978 -0.18344731535763 + 1 0.091891880675964 -0.49273930453984 -0.13589797183851 0 0.060590572655201 2.4012949066087e-26 -0.012408400885761 0 0 -0.0035026066470891 0 0 -0.0011950702173635 0 0 0 -0.0015429038321599 0 0.15219141542912 0 -0.053587096743286 0.0074064522050321 -0.015923656057566 0.002253245562315 0.0090892481384799 -0.063547312282026 + 1 0.10270269148678 -0.48958371651939 -0.1513458229036 0 0.015393483452499 0.084276184439659 -0.0094509832561016 0 0 -0.0015683997189626 0 0 -0.013011656701565 0 0 0 0 0 0.15163862705231 0 -0.041287097148597 -0.031393547542393 -0.0029236562550068 0.088153246790171 0.01738924800884 -0.19314731564373 + 1 0.11351350229759 -0.48607750760778 -0.16661362540296 0 -0.0049544586800039 0.2446226477623 -0.0053962054662406 0 0 0 0 0 -0.013152251951396 0.0011044126003981 0 0 0 0 0.066562041640282 0 -0.029687098227441 -0.078893546946347 -0.0059236562810838 0.017553243786097 -0.0053107520798221 -0.036047308705747 + 1 0.1243243131084 -0.482220677805 -0.18168242685598 0 -0.01080719102174 0.16756856441498 -0.0025067604146898 0 0 0 0 0 -0.0088619040325284 0.10258268564939 0 0 0 0 0.012005048803985 0 -0.021687096916139 -0.032093548215926 -0.006923656212166 0.062953244894743 -0.0041107522556558 -0.077147311531007 + 1 0.13513512391921 -0.47801322711106 -0.19653327478207 0.02777655608952 -0.0094085298478603 0.057876385748386 0 0 0 0 0 0 -0.0046520605683327 0.15266855061054 0 0 0 0 -0.010630848817527 0 -0.028887095861137 -0.02389354724437 -0.0087236562394537 0.0098532475531101 0.0017892479081638 0.061852690763772 + 1 0.14594593473002 -0.47345515552597 -0.21114721670061 0.1495973020792 -0.0058401320129633 0.00094535760581493 0 0 0 0 0 0 -0.0020252661779523 0.081088602542877 0 7.5448255643096e-08 0 0 -0.015581800602376 0 -0.025487097911537 -0.00049354787915945 -0.011723656207323 0.024553250521421 0.00038924789987504 -0.0054473103955388 + 1 0.15675674554083 -0.46854646304971 -0.22550530013101 0.12429348379374 -0.002888711867854 -0.019582450389862 0 0 0 0 0 0 0 0.021482115611434 0 0.066801764070988 0 0 -0.01223857421428 0 -0.02568709757179 -0.0035935482010245 -0.0018236562609673 0.02225324884057 -0.0075107525335625 -0.031247309409082 + 1 0.16756755635164 -0.46328714968228 -0.23958857259266 0.049149297177792 -0.001200036262162 -0.020836120471358 0 0 0 0.0026805191300809 0 0 0 -0.0057318191975355 0 0.17526826262474 0 0 -0.007129117846489 0 -0.019887096248567 -0.010493547655642 -0.0091236562293489 0.0025532469153404 0.0011892479233211 -0.095247312448919 + 1 0.17837836716245 -0.4576772154237 -0.25337808160496 0.0058260434307158 0 -0.014399533160031 0 0 0 0.079301044344902 0 0 0 -0.013821039348841 0 0.11593579500914 0 0 -0.003362531773746 0 -0.029887097887695 -0.024893549270928 -0.012123656226322 0.053453247994184 0.0093892476288602 -0.051047309301794 + 1 0.18918917797326 -0.45171666027396 -0.2668548746873 -0.011150880716741 0 -0.0076954429969192 0.0011043065460399 0 0 0.097848139703274 0 0 0 -0.012263779528439 0 0.03890872746706 0 0 0 0 -0.036987095139921 0.0021064523607492 -0.016323656309396 0.029853243380785 0.0075892478926107 -0.0091473096981645 + 1 0.19999998878407 -0.44540548423305 -0.27999999935909 -0.013848732225597 0 -0.0033972456585616 0.10258162766695 0 0 0.047784235328436 0 0 0 -0.0076978113502264 0 -0.00034771647187881 0 0 0 0 -0.037287096492946 0.020606452599168 -0.013623656239361 -0.017846751958132 -0.0050107521237805 0.12615268770605 + 1 0.21081079959488 -0.43874368730098 -0.29279450313971 -0.010243374854326 0 0 0.15266886353493 0 0 0.011053452268243 0 0 0 -0.0038390003610402 0.00055644899839535 -0.014233827590942 0 0 0 0 -0.036187096498907 0.0076064523309469 -0.011723656207323 0.018653247505426 -0.0022107519907877 0.023652690462768 + 1 0.22162161040569 -0.43173126947776 -0.30521943354858 -0.0057357028126717 0 0 0.081089183688164 0 0 -0.0050355666317046 0 0 0 -0.0016052267747 0.085981898009777 -0.014752581715584 0 0 0 0 -0.040587096475065 0.023506452329457 -0.021523656323552 0.022353250533342 0.016689247335307 -0.076547308824956 + 1 0.2324324212165 -0.42436823076337 -0.31725583810507 -0.002625027904287 0 0 0.021482426673174 0 0.00028454218409024 -0.009330440312624 0 0 0 0 0.13706727325916 -0.010065745562315 0 0 0 0 -0.032887096516788 -0.013293548487127 -0.017923655919731 0.014253247529268 0.016589247505181 -0.096347308717668 + 1 0.24324323202732 -0.41665457115781 -0.32888476432859 0 0 0 -0.0057317009195685 0 0.080655962228775 -0.0078330878168344 0 0 0 0 0.074951559305191 -0.0053311996161938 0 0 0 0 -0.044587097130716 -0.039993547834456 -0.019323656335473 0.11035325005651 -0.022410751436837 -0.097647308371961 + 1 0.25405404283813 -0.4085902906611 -0.34008725973853 0.00062593474285677 0 0 -0.01382102444768 0 0.13821229338646 -0.0047573610208929 0 0 0 0 0.020650375634432 -0.0023370909038931 0 0 0 0 -0.049287098459899 0.028606452979147 -0.027623657137156 0.03745324537158 -0.014610751648434 0.037952690385282 + 1 0.26486485364894 -0.40017538927323 -0.3508443718543 0.096728548407555 0 0 -0.012263810262084 0 0.077859088778496 -0.0023153687361628 0 0 0 0 -0.0044988198205829 0 0 0 0 0 -0.025887097232044 -0.1584935458377 0.010576343163848 0.28665323927999 0.0081892478046939 -0.28344732429832 + 1 0.27567566445975 -0.39140986699419 -0.36113714819529 0.15420092642307 0 0 -0.0076978439465165 0 0.022258253768086 0 0 0 0 0 -0.012204997241497 0 0 0.0040207784622908 0 0 -0.03188709821552 -0.1056935461238 -0.016523656435311 0.082253251224756 0.012089247698896 0.23425269220024 + 1 0.28648647527056 -0.38229372382399 -0.37094663628089 0.084321089088917 0 0 -0.0038390222471207 0 -0.0038734152913094 0 0 0 0 0 -0.011045484803617 0 0 0.11895155161619 0 0 -0.011487097479403 0.15390645246953 -0.02732365578413 -0.33114675804973 -0.0015107520157471 0.46645268891007 + 1 0.29729728608137 -0.37282695976264 -0.38025388363051 0.023231994360685 0 0 -0.0016052387654781 0 -0.012109502218664 0 0.021616401150823 0 0 0 -0.0070121022872627 0 0 0.14677220582962 0 0 -0.014587095938623 0.12170645128936 -0.021123656071723 -0.25024675950408 -0.0087107523577288 0.30875268671662 + 1 0.30810809689218 -0.36300957481012 -0.38903993776353 -0.0050610406324267 0 8.3067540401771e-08 0 0 -0.011185213923454 0 0.16000151634216 0 0 0 -0.0035262131132185 0 0 0.071676351130009 0 0 -0.011187096126378 -0.021293547935784 0.013976342976093 0.075053248554468 -0.0037107520038262 -0.023047308437526 + 1 0.31891890770299 -0.35284156896643 -0.39728584619936 -0.013730604201555 0 0.073483273386955 0 0 -0.0071830214001238 0 0.14506870508194 0 0 0 -0.0014841614756733 0 0 0.016580177471042 0 0 -0.010987096466124 -0.010493547655642 0.0095763429999352 -0.01044675335288 -0.004710752167739 -0.013647309504449 + 1 0.3297297185138 -0.34232294223159 -0.40497265645739 -0.012426199391484 0 0.19279517233372 0 0 -0.0036426351871341 0 0.060439497232437 0.0062459269538522 0 0 0 0 0 -0.0075533492490649 0 0 -0.02088709641248 -0.050193549133837 -0.0023236563429236 0.046753246337175 -0.017410752479918 -0.12824730481952 + 1 0.34054052932461 -0.33145369460559 -0.41208141605701 -0.007888650521636 0 0.12752863764763 0 0 -0.0015433629741892 0 0.0091338297352195 0.13768030703068 0 0 0 0 0 -0.013995659537613 0 0 0.0065129032736877 0.018406452611089 0.0043763434514403 -0.090446751564741 -0.023310751770623 0.15285268519074 + 1 0.35135134013542 -0.32023382608842 -0.41859317251764 -0.0039670118130744 0.0024526501074433 0.042799100279808 0 0 0 0 -0.011567215435207 0.16047409176826 0 0 0 0 0 -0.011749630793929 0 0 -0.017287096939981 -0.054993544705212 0.003176343627274 0.041453246027231 0.011889248038642 -0.00044730957597494 + 1 0.36216215094623 -0.30866333668009 -0.42448897335866 -0.0016696940874681 0.10108884423971 -0.00038268772186711 0 0 0 0 -0.015510492026806 0.076271519064903 0 0 0 0 0 -0.0071360412985086 0 0 -0.0055870963260531 -0.018493547104299 -0.0011236565187573 -0.0085467547178268 0.015189248020761 0.18875269684941 + 1 0.37297296175705 -0.2967422263806 -0.42974986609946 0 0.13238954544067 -0.01565725915134 0 0 0 0 -0.011813691817224 0.016730114817619 0 0 0 0 0 -0.0034730527549982 0.041677042841911 0 0.0019129030406475 -0.038693548180163 -0.00032365601509809 -4.6752393245697e-05 -0.00031075207516551 0.11815269384533 + 1 0.38378377256786 -0.28447049518995 -0.43435689825945 0 0.066455982625484 -0.016227813437581 0 0 0 0 -0.0067452238872647 -0.0089998971670866 0 0 0 0 0 0 0.17081795632839 0 -0.0021870965138078 -0.0014935480430722 -0.011423656251281 0.028053250163794 8.924794383347e-05 0.13765268865973 + 1 0.39459458337867 -0.27184814310814 -0.43829111735802 0 0.016140213236213 -0.0098451487720013 0 0 0 0 -0.0031334289815277 -0.015581687912345 0 0 0 0 0 0 0.13085924088955 0 -0.012287096120417 -0.031593547202647 -0.0014236560091376 0.042453248053789 -0.0017107521416619 -0.05474731232971 + 1 0.40540539418948 -0.25887517013517 -0.44153357091458 0 -0.0062018162570894 0.10811647772789 0 0 0 0 0 -0.012856062501669 0 0 0 0 0 0 0.049078978598118 0 -0.020487097091973 -0.050293547101319 -0.0031236563809216 0.083953250199556 0.00098924792837352 -0.12484730686992 + 1 0.41621620500029 -0.24555157627104 -0.4440653064485 0 -0.012402662076056 0.16706095635891 0 0 0 0 0 -0.0061247227713466 0 0 0 0 0 0 0.0040129679255188 0 -0.0066870963200927 0.034006453119218 -0.010323656199034 -0.067946752533317 0.0021892479853705 0.20965269301087 + 1 0.4270270158111 -0.23187736151574 -0.4458673714792 0 -0.010600126348436 0.090098448097706 0 0 0 0 0 0.092498958110809 0 0 0 0 0 0 -0.01310474704951 0 -0.02568709757179 -0.034993548877537 -0.015623656101525 0.092453245073557 0.010789248044603 -0.083147308789194 + 1 0.43783782662191 -0.21785252586928 -0.44692081352607 0 0.0093702841550112 0.023869017139077 0 0 0 0 0 0.13414172828197 0 0 0 0 0 0 -0.015217265114188 0 -0.034987098537385 -0.014693547971547 -0.021223655901849 0.061453249305487 0.013389248284511 -0.2369472971186 + 1 0.44864863743272 -0.20347706933166 -0.4472066801085 0 0.1374693363905 -0.0063686883077025 0 0 0 0 0 0.069246374070644 0 0 0 0 1.2008145858999e-05 0 -0.010944607667625 0 -0.021287097595632 0.0089064522180706 -0.017023656051606 -0.023146752268076 0.013789247605018 -0.078247307799757 + 1 0.45945944824353 -0.18875099190288 -0.4467060187459 0 0.13356995582581 -0.015356711111963 0 0 0 0 0 0.017592553049326 0 0 0 0 0.06429036706686 0 -0.0060129929333925 0 -0.030487096868455 -0.014193546958268 -0.017123656347394 0.047353249043226 0.00018924794858322 0.023852690123022 + 1 0.47027025905434 -0.17367429358294 -0.44539987695765 0 0.057118438184261 -0.013626421801746 0.0040210401639342 0 0 0 0 -0.0056622386910021 0 0 0 0 0.14020979404449 0 -0.0027119813021272 0 -0.042687098495662 -0.0022935476154089 -0.020723655819893 0.055353250354528 0.0013892479182687 0.095052690245211 + 1 0.48108106986515 -0.15824697437184 -0.44326930226316 0 0.009488333016634 -0.0085531240329146 0.11895248293877 0 0 0 0 -0.012351076118648 0 0 0 0 0.086744964122772 0 0 0 -0.017187097109854 0.080606455914676 -0.026223655790091 -0.095046754926443 -0.011210751836188 0.24795268569142 + 1 0.49189188067596 -0.14246903426957 -0.44029534218182 0 -0.01000221259892 -0.0042655561119318 0.14677180349827 0 0 0 0 -0.010752606205642 0.0067461780272424 0 0 0 0.027409762144089 0 0 0 -0.043387095443904 0.013006452238187 -0.0074236562941223 0.03295324370265 -0.014210752327926 -0.0089473100379109 + 1 0.50270269148678 -0.12634047327615 -0.43645904423304 0 -0.013997609727085 -0.0017835852922872 0.071675792336464 0 0 0 0 -0.0066744363866746 0.11429480463266 0 0 0 -0.0018132763216272 0 0 0 -0.014087096787989 -0.10489354748279 0.028776343911886 0.20875324681401 -0.00061075203120708 -0.30814731027931 + 1 0.51351350229759 -0.10986129139156 -0.43174145593619 0 -0.010824510827661 0 0.016579894348979 0.0021460687275976 0 0 0 -0.0033013850916177 0.12614978849888 0 0 0 -0.011727117933333 0 0 0 -0.022487097419798 -0.0638935463503 0.0048763435333967 0.085353244096041 0.011989247868769 -0.43564730789512 + 1 0.5243243131084 -0.093031488615813 -0.42612362481069 0 -0.0062421360053122 0 -0.0075534516945481 0.088452741503716 0 0 0 -0.0013714701635763 0.058374084532261 0 0 0 -0.011573190800846 0 0 0 0.0099129031877965 0.14590645115823 -0.021523656323552 -0.26314675435424 -0.0051107519539073 0.32535269949585 + 1 0.53513512391921 -0.075851064948902 -0.41958659837593 0 0.050519626587629 0 -0.013995666056871 0.11584085226059 0 0 0 0 0.012078051455319 0 0 0 -0.0077023864723742 0 0 0 0.0036129031796008 0.11790645401925 -0.02732365578413 -0.18784674629569 -0.0058107521617785 0.11255268845707 + 1 0.54594593473002 -0.058320020390831 -0.4121114241513 0 0.14021460711956 0 -0.011749600991607 0.058148983865976 0 0 0 0 -0.0076598017476499 0 0 0 -0.0040079848840833 0 0.0030658126343042 0 -0.016887097619474 -0.08299354929477 -0.00062365643680096 0.10565324500203 0.0095892482204363 -0.24984732177109 + 1 0.55675674554083 -0.040438354941598 -0.40367914965621 0 0.092748634517193 0 -0.0071360059082508 0.014122685417533 0 0 0 0 -0.012477427721024 0 0 0 -0.0017329071415588 0 0.12636105716228 0 -0.0057870969176292 -0.050393548794091 -0.0076236561872065 0.075053248554468 0.0042892479104921 -0.18254731502384 + 1 0.56756755635164 -0.022206068601203 -0.39427082241004 0 0.031126981601119 0 -0.0034730304032564 -0.0054265889339149 0 0 0.030862841755152 0 -0.010122697800398 0 0 0 0 0 0.16548693180084 0 -0.0066870963200927 -0.099193547852337 0.0012763440608978 0.084453243762255 -0.010610751924105 -0.032047308050096 + 1 0.57837836716245 -0.0036231613696475 -0.3838674899322 0 -0.00027817318914458 0 0 -0.010852329432964 0 0 0.16621923446655 0 -0.0060191727243364 0 0 0 0 0 0.083069980144501 0 0.018612903542817 -0.030793548561633 0.0016763433814049 -0.032246753573418 -0.0034107520477846 0.16925269458443 + 1 0.58918917797326 0.01531036675307 -0.37245019974209 0 -0.011387062259018 0.00035563000710681 0 -0.0092751104384661 0 0 0.13810387253761 0 -0.0028834280092269 0 0 0 0 0 0.020175265148282 0 -0.0045870970934629 -0.039693546481431 0.0030763437971473 0.017853248864412 0.016789247165434 0.058652688749135 + 1 0.59999998878407 0.034594515766949 -0.35999999935909 0 -0.011802065186203 0.10081872344017 0 -0.0056944275274873 0 0 0.054610330611467 0 0 0 0 0 0 0 -0.0077522699721158 0 0.0062129032448865 -0.0081935478374362 0.0058763436973095 -0.051746753160842 0.0091892479686067 0.24165268335491 + 1 0.61081079959488 0.054229285671989 -0.34649793630261 0 -0.008052596822381 0.17276559770107 0 -0.0027938217390329 0 0 0.0064733815379441 0 0 0.0016005024081096 0 0 0 0 -0.015503327362239 0 -0.0093870973214507 -0.08979354519397 0.0080763436853886 0.088053245097399 -0.018010751460679 -0.10724730696529 + 1 0.62162161040569 0.07421467646819 -0.33192505809204 0 -0.0042649595998228 0.097324542701244 0 0 0 0 -0.012389867566526 0 0 0.096228934824467 0 0 0 0 -0.013250158168375 0 0.0053129033185542 -0.0081935478374362 0.014976343140006 -0.0060467533767223 -0.015910751302727 0.14865268860012 + 1 0.6324324212165 0.094550688155554 -0.31626241224678 0.028872592374682 -0.0018696727929637 0.027823185548186 0 0 0 0 -0.015387481078506 0 0 0.13414172828197 0 0 0 0 -0.0081348968669772 0 0.0047129031736404 -0.052293551154435 0.021276343613863 0.0077532455325127 0.011589247616939 0.18645268771797 + 1 0.64324323202732 0.11523732073408 -0.29949104628622 0.1349770128727 0 -0.0048416242934763 0 0 0 0 -0.01138152834028 0 0 0.069246374070644 0 0 0 0 -0.0039911740459502 0 0.0067129032686353 -0.016593548469245 0.027076344937086 0.018253248184919 0.024089247803204 0.1892526904121 + 1 0.65405404283813 0.13627457420376 -0.28159200772977 0.10760726034641 0 -0.015136853791773 0 0 0 0 -0.0063730031251907 0 0 0.017592553049326 0 0.053776569664478 0 0 0 0 0.0062129032448865 -0.032093548215926 0.020576342940331 -0.028046753257513 0.0091892479686067 0.028452690690756 + 1 0.66486485364894 0.15766244856461 -0.26254634409682 0.041445430368185 0 -0.01398154720664 0.0027592312544584 0 0 0 -0.0029166976455599 0 0 -0.0056622386910021 0 0.17381598055363 0 0 0 0 -0.001187096349895 -0.050693546421826 0.021176343783736 0.041453246027231 0.020289248670451 -0.12694731261581 + 1 0.67567566445975 0.17940094381662 -0.24233510290676 0.0041748615913093 0 -0.0089788129553199 0.11372494697571 0 0 0 0 0 0 -0.012351076118648 0 0.12343798577785 0 0 0 0 0.017612903378904 0.042106452398002 0.018076343461871 -0.12294675037265 0.017289248178713 0.13255269173533 + 1 0.68648647527056 0.20149005995979 -0.22093933167899 -0.010208387859166 0 -0.0045533217489719 0.14893823862076 0 0 0 0 0 0 -0.010752606205642 0 0.043845307081938 0 0 0 0 0.041512903757393 0.049206453375518 0.027976345270872 -0.12854675576091 0.038189248065464 0.040852691046894 + 1 0.69729728608137 0.22392979699412 -0.19834007793292 -0.012246385216713 0 -0.0019292180659249 0.074762977659702 0 0 0 0 0 0.020822903141379 -0.0066744363866746 0 0.0017421913798898 0 0 0 0 0.027312903665006 -0.001593547873199 0.015076342970133 -0.037746753543615 0.0091892479686067 -0.22444730903953 + 1 0.70810809689218 0.24672015491961 -0.17451838918792 -0.0089307744055986 0 0 0.018157737329602 0 0 0 0 0 0.13064929842949 -0.0033013850916177 0 -0.013717637397349 0 0 0 0 0.039112904109061 0.054306454025209 0.013676343485713 -0.081246752291918 0.0090892481384799 -0.077847308479249 + 1 0.71891890770299 0.26986113373627 -0.14945531296342 -0.0049531273543835 0.054176468402147 0 -0.0069770426489413 0 0 0 0 0 0.11330310255289 -0.0013714701635763 0 -0.015004185028374 0 0 0 0 0.048112903721631 0.041506451554596 0.025376342236996 -0.12344675138593 0.0063892480684444 0.25445269141346 + 1 0.7297297185138 0.29335273344409 -0.12313189677879 -0.0022502727806568 0.15725728869438 0 -0.013952994719148 0 0 0 0 0 0.045990746468306 0 0 -0.010505232028663 0 0 0 0 0.07791290152818 -0.0022935476154089 0.018676344305277 -0.024246752262115 0.04248924634885 0.085852690972388 + 1 0.74054052932461 0.31719495404306 -0.095529188153436 0 0.10772325843573 0 -0.011925142258406 0 0 0 0 0 0.0062225582078099 0 0 -0.005665572360158 0.072235301136971 0 0 0 0.067712903954089 -0.037293546833098 0.020676344633102 0.018553245812654 0.011789248208515 -0.20184731390327 + 1 0.75135134013542 0.3413877955332 -0.066628234606755 0 0.037206649780273 0 -0.0073214070871472 0 0 0 0 0 -0.0095938388258219 0 0 -0.0025188846047968 0.209676399827 0 0 0 0.099112902767956 0.036506452597678 0.025876343250275 -0.070646753534675 0.028789247269742 -0.1198473116383 + 1 0.76216215094623 0.3659312579145 -0.036410083658144 0 0.00060790922725573 0 0.028887817636132 0 0 0 0 0 -0.012364141643047 0 0 0 0.1436310261488 0 0 0 0.088712905533612 0.01690645236522 0.023276343941689 -0.088646754622459 0.010689248214476 0.071252689696848 + 1 0.77297296175705 0.39082534118696 -0.0048557828269987 0 -0.012588676065207 0 0.15184837579727 0 0 0 0 0 -0.0092787202447653 0 2.1845621631655e-06 0 0.049608871340752 0 0 0 0.085712906904519 -0.034393546171486 0.020676344633102 -0.018446754664183 0.009689248050563 -0.024347308091819 + 1 0.78378377256786 0.41607004535059 0.028053620367284 0 -0.013394667766988 0 0.1210593432188 0 0 0 0 0 -0.0052461246959865 0 0.07354100048542 0 0.00081054569454864 0 0 0 0.13121290225536 0.022306452505291 0.01967634446919 -0.16344675049186 0.0023892478784546 0.16675269696862 + 1 0.79459458337867 0.44166537040537 0.062337078405308 0 -0.0092568807303905 0 0.046627011150122 0 0 0 0 0 -0.002418847521767 0 0.17544116079807 0 -0.016784902662039 0 0 0 0.15361290145665 0.026106451638043 0.037276342511177 -0.11474675312638 0.014089248026721 0.012452690396458 + 1 0.80540539418948 0.46761131635132 0.098013543767675 0.02917392924428 -0.004947098903358 0 0.0046971309930086 0 0 0 0 0 0 0 0.11217899620533 0 -0.017859559506178 0 0 0 -0.02118709590286 -0.047993549145758 0.013076344504952 0.07745324447751 0.0021892479853705 -0.17064730729908 + 1 0.81621620500029 0.49390788318842 0.13510196893499 0.11957256495953 -0.0021839591208845 0 -0.011484319344163 0 0 0 0 0 0 0 0.036549493670464 0 -0.012342507950962 0 0 0 -0.0039870971813798 0.018306451849639 0.019076343625784 -0.05524675315246 0.010389247792773 -0.03394731041044 + 1 0.8270270158111 0.52055507091669 0.17362130638786 0.091601468622684 0 0 -0.013777210377157 0 0 0 0 0 0 0 -0.0013280296698213 0 -0.0065961321815848 0 0 0 0.0037129032425582 0.036206453107297 0.028176344931126 -0.061146752908826 0.025189247797243 0.092052691616118 + 1 0.83783782662191 0.54755287953612 0.21359050860688 0.034355282783508 0 0 -0.010047196410596 0 0 0 0 0 0 0 -0.01445743534714 0 -0.0029119455721229 0.020822903141379 0 0 -0.0069870967417955 -0.029893548227847 0.016676343977451 0.052853245288134 0.021489248494618 -0.052347308956087 + 1 0.84864863743272 0.57490130904672 0.25502852807265 0.002809077501297 0 2.1826426745974e-06 -0.0055723269470036 0 0 0 0 0 0 0 -0.014613589271903 0 0 0.13064929842949 0 0 -0.016887097619474 -0.011393547989428 0.014476343989372 0.037353243678808 0.001989247975871 -0.094247310422361 + 1 0.85945944824353 0.60260035944847 0.29795431726579 -0.009173322468996 0 0.073538526892662 -0.002531590173021 0 0 0 0 0 0 0 -0.0098465224727988 0 0 0.11330310255289 0 0 -0.0071870964020491 0.041306451894343 0.024676345288754 -0.050646753166802 -0.012310751830228 0.016052690334618 + 1 0.87027025905434 0.63065003074138 0.34238682866689 -0.010652085766196 0 0.17544116079807 0 0 0 0 0 0 0 0.0040210401639342 -0.0051689259707928 0 0 0.045990746468306 0 0 -0.0098870964720845 0.0033064521849155 0.026976343244314 0.055753249675035 -0.014910753001459 -0.020947310142219 + 1 0.88108106986515 0.65905032292546 0.38834501475656 -0.0076612252742052 0 0.11218037456274 0 0 0 0 0 0 0 0.11895248293877 -0.0022502795327455 0 0 0.0062225582078099 0 0 0.0030129032675177 0.061606450937688 0.023776344954967 -0.057646753266454 -0.0056107520358637 0.17195269558579 + 1 0.89189188067596 0.6878012360007 0.4358478280154 0.015245664864779 0 0.036550357937813 0 0 0 0 0 0 0 0.14677180349827 0 0 0 -0.0095938388258219 0 0 0.014212903100997 0.0087064522085711 0.037576343864202 -0.044646752998233 -0.0071107522817329 0.09555269125849 + 1 0.90270269148678 0.71690276996709 0.48491422092401 0.14210297167301 0 -0.0013276820536703 0 0 0 0 0 0 0 0.071675792336464 0 0 0 -0.012364141643047 0 0 0.029112902469933 -0.037493546493351 0.033676344901323 -0.028546752408147 -0.00081075204070657 0.06235269177705 + 1 0.91351350229759 0.74635492482465 0.535563145963 0.13056182861328 0 -0.014457356184721 0 0 0 0 0 0 0 0.016579894348979 0 0.00069556123344228 0 -0.0092787202447653 0 0 0.017512903548777 -0.012193548493087 0.027576342225075 -0.073646754026413 -0.0079107518540695 0.090652690269053 + 1 0.9243243131084 0.77615770057338 0.58781355561298 0.054395545274019 0 -0.014613640494645 0 0 0 0 0 0 0 -0.0075534516945481 0 0.10747737437487 0 -0.0052461246959865 0 0 -0.028887095861137 -0.040393547154963 0.02277634292841 0.032053243368864 -0.030210751225241 -0.11324730422348 + 1 0.93513512391921 0.80631109721326 0.64168440235453 0.0082204462960362 0 -0.0098466016352177 0 0 0 0 0 0 0 -0.013995666056871 0 0.17133408784866 0 -0.002418847521767 0 0 0.0011129034683108 -0.024293546564877 0.026476342231035 -0.008346751332283 0.0063892480684444 -0.13364730682224 + 1 0.94594593473002 0.8368151147443 0.69719463866827 -0.01041049323976 0 -0.0051689869724214 0.042828563600779 0 0 0 0 0 0 -0.011749600991607 0 0.093689449131489 0 0 0 0 -0.030687096528709 0.0040064523927867 0.022076342254877 -0.0096467547118664 -0.012210752000101 -0.096747308038175 + 1 0.95675674554083 0.86766975316651 0.75436321703481 -0.013959442265332 0 -0.0022503104992211 0.15526303648949 0 0 0 0 0 0 -0.0071360059082508 0 0.025812968611717 0 0 0 0 -0.034287097863853 -0.044993546791375 0.019276343286037 0.092153239995241 -0.0098107523517683 -0.099347307346761 + 1 0.96756755635164 0.89887501247988 0.81320908993473 -0.01063232216984 0 0 0.11444798856974 0 0 0 0 0 0 -0.0034730304032564 0.037509337067604 -0.0056235245428979 0 0 0 0 -0.016187096945941 0.00020645186305046 0.022976342588663 0.016353245824575 -0.015210752491839 0.12425269279629 + 1 0.97837836716245 0.93043089268441 0.87375120984866 -0.006070701405406 0 0 0.041782386600971 0 0 0 0 0 0 0 0.15373615920544 -0.015256246551871 0 0 0 0 -0.013587097637355 -0.029593546874821 0.029876343905926 0.02615324780345 0.0034892478724942 0.088752687908709 + 1 0.98918917797326 0.9623373937801 0.93600852925718 -0.0028200859669596 0 0 0.0025689851026982 0 0.028872592374682 0 0 0 0 0 0.11777331680059 -0.013806855306029 0 0 0 0 -0.0050870971754193 -0.018593546934426 0.036676343530416 -0.0050467513501644 0.0057892481563613 0.12315268907696 + 1 0.99999998878407 0.99459451576695 1.0000000006409 0 0 0 -0.01208124961704 0 0.1349770128727 0 0 0 0 0 0.044171079993248 -0.0087651275098324 0 0 0 0 0.0079129033256322 -0.18649354297668 0.025376342236996 0.10375324264169 0.0030892478534952 -0.1448473026976 +# + diff --git a/tests/reprsimil/test_brsa.py b/tests/reprsimil/test_brsa.py new file mode 100755 index 000000000..aa6e52d9c --- /dev/null +++ b/tests/reprsimil/test_brsa.py @@ -0,0 +1,225 @@ +# Copyright 2016 Mingbo Cai, Princeton Neuroscience Instititute, +# Princeton University +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from sklearn.utils.validation import NotFittedError +import pytest + + +def test_can_instantiate(): + import brainiak.reprsimil.brsa + import numpy as np + s = brainiak.reprsimil.brsa.BRSA() + assert s, "Invalid BRSA instance!" + + + + voxels = 100 + samples = 500 + features = 3 + + s = brainiak.reprsimil.brsa.BRSA(n_iter=50, rank=5, GP_space=True, GP_inten=True, tol=2e-3,\ + pad_DC=False,epsilon=0.001,space_smooth_range=10.0,inten_smooth_range=100.0) + assert s, "Invalid BRSA instance!" + +def test_fit(): + from brainiak.reprsimil.brsa import BRSA + import brainiak.utils.utils as utils + import scipy.stats + import numpy as np + import os.path + import numdifftools as nd + file_path = os.path.join(os.path.dirname(__file__), "example_design.1D") + # Load an example design matrix + design = utils.ReadDesign(fname=file_path) + # concatenate it by 4 times, mimicking 4 runs of itenditcal timing + design.design_used = np.tile(design.design_used[:,0:17],[4,1]) + design.n_TR = design.n_TR * 4 + + + n_V = 200 + n_C = np.size(design.design_used,axis=1) + n_T = design.n_TR + + + noise_bot = 0.5 + noise_top = 1.5 + noise_level = np.random.rand(n_V)*(noise_top-noise_bot)+noise_bot + # noise level is random. + + # AR(1) coefficient + rho1_top = 0.8 + rho1_bot = -0.2 + rho1 = np.random.rand(n_V)*(rho1_top-rho1_bot)+rho1_bot + + # generating noise + noise = np.zeros([n_T,n_V]) + noise[0,:] = np.random.randn(n_V) * noise_level / np.sqrt(1-rho1**2) + for i_t in range(1,n_T): + noise[i_t,:] = noise[i_t-1,:] * rho1 + np.random.randn(n_V) * noise_level + + # ideal covariance matrix + ideal_cov = np.zeros([n_C,n_C]) + ideal_cov = np.eye(n_C)*0.6 + ideal_cov[0,0] = 0.2 + ideal_cov[5:9,5:9] = 0.6 + for cond in range(5,9): + ideal_cov[cond,cond] = 1 + idx = np.where(np.sum(np.abs(ideal_cov),axis=0)>0)[0] + L_full = np.linalg.cholesky(ideal_cov) + + # generating signal + snr_level = 5.0 # test with high SNR + # snr = np.random.rand(n_V)*(snr_top-snr_bot)+snr_bot + # Notice that accurately speaking this is not snr. the magnitude of signal depends + # not only on beta but also on x. + inten = np.random.randn(n_V) * 20.0 + + # parameters of Gaussian process to generate pseuso SNR + tau = 0.8 + smooth_width = 5.0 + inten_kernel = 1.0 + + coords = np.arange(0,n_V)[:,None] + + dist2 = np.square(coords-coords.T) + + inten_tile = np.tile(inten,[n_V,1]) + inten_diff2 = (inten_tile-inten_tile.T)**2 + + K = np.exp(-dist2/smooth_width**2/2.0 -inten_diff2/inten_kernel**2/2.0) * tau**2 + np.eye(n_V)*tau**2*0.001 + + L = np.linalg.cholesky(K) + snr = np.exp(np.dot(L,np.random.randn(n_V))) * snr_level + sqrt_v = noise_level*snr + betas_simulated = np.dot(L_full,np.random.randn(n_C,n_V)) * sqrt_v + signal = np.dot(design.design_used,betas_simulated) + + + Y = signal + noise + + + scan_onsets = np.linspace(0,design.n_TR,num=5) + + + # Test fitting with GP prior. + brsa = BRSA(GP_space=True,GP_inten=True,verbose=True,n_iter = 20) + + brsa.fit(X=Y, design=design.design_used, scan_onsets=scan_onsets, + coords=coords, inten=inten) + + # Check that result is significantly correlated with the ideal covariance matrix + u_b = brsa.U_[1:,1:] + u_i = ideal_cov[1:,1:] + p = scipy.stats.spearmanr(u_b[np.tril_indices_from(u_b,k=-1)],u_i[np.tril_indices_from(u_i,k=-1)])[1] + assert p < 0.01, "Fitted covariance matrix does not correlate with ideal covariance matrix!" + # check that the recovered SNRs makes sense + p = scipy.stats.pearsonr(brsa.nSNR_,snr)[1] + assert p < 0.01, "Fitted SNR does not correlate with simualted SNR!" + assert np.isclose(np.mean(np.log(brsa.nSNR_)),0), "nSNR_ not normalized!" + + assert np.abs(brsa.bGP_ - tau) / tau < 0.3, "standard deviation of GP deviates too much" + assert np.abs(brsa.lGPspace_ - smooth_width) / smooth_width < 0.5,\ + "spatial length scale of GP deviates too much" + assert np.abs(brsa.lGPinten_ - inten_kernel) / inten_kernel < 0.5,\ + "intensity length scale of GP deviates too much" + + + # test if the gradients are correct + XTY,XTDY,XTFY,YTY_diag, YTDY_diag, YTFY_diag, XTX, XTDX, XTFX = brsa._prepare_data(design.design_used,Y,n_T,n_V,scan_onsets) + n_l = n_C*(n_C+1)/2 + param0_fitU = np.random.randn(n_l+n_V) * 0.1 + param0_fitV = np.random.randn(n_V+1) * 0.1 + param0_fitV[:n_V-1] += np.log(snr[:n_V-1])*2 + param0_fitV[n_V-1] += np.log(smooth_width)*2 + param0_fitV[n_V] += np.log(inten_kernel)*2 + l_idx = np.tril_indices(n_C) + ll0, deriv0 = brsa._loglike_AR1_diagV_fitU(param0_fitU, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, \ + XTY, XTDY, XTFY, np.log(snr)*2, l_idx,n_C,n_T,n_V,n_C) + + vec = np.zeros(np.size(param0_fitU)) + vec[0] = 1 + dd = nd.directionaldiff(lambda x: brsa._loglike_AR1_diagV_fitU(x, XTX, XTDX, XTFX, YTY_diag, YTDY_diag,\ + YTFY_diag, XTY, XTDY, XTFY, np.log(snr)*2,\ + l_idx,n_C,n_T,n_V,n_C)[0], param0_fitU, vec) + assert np.isclose(dd, np.dot(deriv0,vec), rtol=0.05), 'gradient of fitU incorrect' + + vec = np.zeros(np.size(param0_fitU)) + vec[n_l] = 1 + dd = nd.directionaldiff(lambda x: brsa._loglike_AR1_diagV_fitU(x, XTX, XTDX, XTFX, YTY_diag, YTDY_diag,\ + YTFY_diag, XTY, XTDY, XTFY, np.log(snr)*2,\ + l_idx,n_C,n_T,n_V,n_C)[0], param0_fitU, vec) + assert np.isclose(dd, np.dot(deriv0,vec), rtol=0.05), 'gradient of fitU incorrect' + + ll0, deriv0 = brsa._loglike_AR1_diagV_fitV(param0_fitV, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, \ + XTY, XTDY, XTFY, L_full[l_idx], np.tan(rho1*np.pi/2), l_idx,n_C,n_T,n_V,n_C,True,True,\ + dist2,inten_diff2,100,100) + vec = np.zeros(np.size(param0_fitV)) + vec[0] = 1 + dd = nd.directionaldiff(lambda x: brsa._loglike_AR1_diagV_fitV(x, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, \ + XTY, XTDY, XTFY, L_full[l_idx], np.tan(rho1*np.pi/2),\ + l_idx, n_C, n_T, n_V, n_C, True, True, dist2, inten_diff2,\ + 100, 100)[0], param0_fitV, vec) + assert np.isclose(dd, np.dot(deriv0,vec), rtol=0.05), 'gradient of fitV incorrect' + + vec = np.zeros(np.size(param0_fitV)) + vec[n_V-1] = 1 + dd = nd.directionaldiff(lambda x: brsa._loglike_AR1_diagV_fitV(x, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, \ + XTY, XTDY, XTFY, L_full[l_idx], np.tan(rho1*np.pi/2),\ + l_idx, n_C, n_T, n_V, n_C, True, True, dist2, inten_diff2,\ + 100, 100)[0], param0_fitV, vec) + assert np.isclose(dd, np.dot(deriv0,vec), rtol=0.05), 'gradient of fitV incorrect' + + vec = np.zeros(np.size(param0_fitV)) + vec[n_V] = 1 + dd = nd.directionaldiff(lambda x: brsa._loglike_AR1_diagV_fitV(x, XTX, XTDX, XTFX, YTY_diag, YTDY_diag, YTFY_diag, \ + XTY, XTDY, XTFY, L_full[l_idx], np.tan(rho1*np.pi/2),\ + l_idx, n_C, n_T, n_V, n_C, True, True, dist2, inten_diff2,\ + 100, 100)[0], param0_fitV, vec) + assert np.isclose(dd, np.dot(deriv0,vec), rtol=0.05), 'gradient of fitV incorrect' + + # Test fitting without GP prior. + brsa = BRSA() + brsa.fit(X=Y, design=design.design_used, scan_onsets=scan_onsets) + + # Check that result is significantly correlated with the ideal covariance matrix + u_b = brsa.U_[1:,1:] + u_i = ideal_cov[1:,1:] + p = scipy.stats.spearmanr(u_b[np.tril_indices_from(u_b,k=-1)],u_i[np.tril_indices_from(u_i,k=-1)])[1] + assert p < 0.01, "Fitted covariance matrix does not correlate with ideal covariance matrix!" + # check that the recovered SNRs makes sense + p = scipy.stats.pearsonr(brsa.nSNR_,snr)[1] + assert p < 0.01, "Fitted SNR does not correlate with simualted SNR!" + assert np.isclose(np.mean(np.log(brsa.nSNR_)),0), "nSNR_ not normalized!" + assert not hasattr(brsa,'bGP_') and not hasattr(brsa,'lGPspace_') and not hasattr(brsa,'lGPinten_'),\ + 'the BRSA object should not have parameters of GP if GP is not requested.' + # GP parameters are not set if not requested + + + # Test fitting with GP over just spatial coordinates. + brsa = BRSA(GP_space=True) + brsa.fit(X=Y, design=design.design_used, scan_onsets=scan_onsets, coords=coords) + # Check that result is significantly correlated with the ideal covariance matrix + u_b = brsa.U_[1:,1:] + u_i = ideal_cov[1:,1:] + p = scipy.stats.spearmanr(u_b[np.tril_indices_from(u_b,k=-1)],u_i[np.tril_indices_from(u_i,k=-1)])[1] + assert p < 0.01, "Fitted covariance matrix does not correlate with ideal covariance matrix!" + # check that the recovered SNRs makes sense + p = scipy.stats.pearsonr(brsa.nSNR_,snr)[1] + assert p < 0.01, "Fitted SNR does not correlate with simualted SNR!" + assert np.isclose(np.mean(np.log(brsa.nSNR_)),0), "nSNR_ not normalized!" + assert not hasattr(brsa,'lGPinten_'),\ + 'the BRSA object should not have parameters of lGPinten_ if only smoothness in space is requested.' + # GP parameters are not set if not requested + + \ No newline at end of file diff --git a/tests/utils/example_design.1D b/tests/utils/example_design.1D new file mode 100755 index 000000000..7385edea6 --- /dev/null +++ b/tests/utils/example_design.1D @@ -0,0 +1,272 @@ +# + 1 -1.0000000112159 0.99459451576695 -0.99999999935909 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0067129032686353 0.010406452231109 -0.009523656219244 -0.050046753138304 0.00098924792837352 0.014952690340579 + 1 -0.98918920040512 0.9623373937801 -0.93600852797536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.0085870968177915 -0.0038935476914048 -0.010923656169325 0.019553247839212 0.0039892479544505 -0.20644730236381 + 1 -0.97837838959431 0.93043089268441 -0.87375120856684 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.030487096868455 0.1236064536497 -0.040723655372858 -0.054246752988547 -0.0075107525335625 -0.0066473102197051 + 1 -0.9675675787835 0.89887501247988 -0.81320908865291 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.067987094633281 0.064706451259553 -0.047223657369614 0.010453246533871 -0.024510751594789 0.085652687586844 + 1 -0.95675676797268 0.86766975316651 -0.75436321575299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.067487093620002 0.11460645031184 -0.074723657220602 -0.12964675202966 -0.030410750885494 0.30405268166214 + 1 -0.94594595716187 0.8368151147443 -0.69719463738645 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.027775989845395 -0.099387097172439 0.11130645405501 -0.059223655611277 -0.0059467516839504 -0.010510752093978 0.0095526902005076 + 1 -0.93513514635106 0.80631109721326 -0.64168440107271 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.14959700405598 -0.089187095873058 0.15680645685643 -0.070323657244444 -0.050846753118094 -0.0029107519658282 0.14565269742161 + 1 -0.92432433554025 0.77615770057338 -0.58781355433115 0 0 0 0 0 0.037642534822226 0 0 0 0 0 0 0 0 0 0 0.12429390102625 -0.083387094549835 0.12480645161122 -0.054423656314611 -0.050246753133251 0.013389248284511 0.11435268912464 + 1 -0.91351352472944 0.74635492482465 -0.53556314468118 0 0 0 0 0 0.12830232083797 0 0 0 0 0 0 0 0 0 0 0.049149610102177 -0.062687094323337 0.13770644646138 -0.042223654687405 -0.046746753156185 0.018289248342626 0.072352689690888 + 1 -0.90270271391863 0.71690276996709 -0.48491421964219 0 0 0 0 0 0.17503398656845 0 0 0 0 0 0 0 0 0 0 0.0058261859230697 -0.045587095431983 0.2022064505145 -0.047923658043146 -0.12844675406814 0.016089248354547 0.16415269766003 + 1 -0.89189190310782 0.6878012360007 -0.43584782673358 0.00055640988284722 0 0 0 0 0.12353418022394 0 0 0 0 0 0 0 0 0 0 -0.011150837875903 -0.056987094692886 0.12560645025223 -0.06052365526557 -0.073546752333641 0.0068892481504008 -0.025347310118377 + 1 -0.88108109229701 0.65905032292546 -0.38834501347474 0.085981301963329 0 0 0 0 0.043058145791292 0 0 0 0 0 0 0 0 0 0 -0.0138487406075 0.029312903992832 -0.087693546898663 -0.014023656025529 0.021853249520063 -0.022210751776583 -0.050747311674058 + 1 -0.8702702814862 0.63065003074138 -0.34238682738507 0.13706742227077 0 0 0 0 -0.0014883950352669 0 0 0 0 0 0 0 0 0.00446742400527 0 -0.010243398137391 0.030112902633846 -0.098093544133008 -0.025723656639457 0.082353252917528 -0.023310751770623 -0.20704731252044 + 1 -0.85945947067539 0.60260035944847 -0.29795431598397 0.074951887130737 0 0 0 0 -0.016573801636696 0 0 0 0 0 0 0 0 0.13216799497604 0 -0.0057357279583812 0.043912903405726 -0.12029355484992 -0.026223655790091 0.087853241711855 0.0078892478486523 -0.07564730849117 + 1 -0.84864865986458 0.57490130904671 -0.25502852679083 0.020650556311011 0 0 0 0 -0.016711676493287 0 0.064530149102211 0 0 0 0 0 0 0.16308039426804 0 -0.0026250404771417 0.069412906654179 -0.029693548567593 -0.015923656057566 -0.02844675257802 0.027189248125069 0.088752687908709 + 1 -0.83783784905377 0.54755287953612 -0.21359050732505 -0.0044987495057285 0 0 0 0 -0.011434393003583 0 0.20859688520432 0 0 0 0 0 0 0.07964064925909 0 0 0.029712903313339 0.11960645299405 -0.00012365635484457 -0.19364675506949 0.012089247698896 0.15545268449932 + 1 -0.82702703824295 0.52055507091669 -0.17362130510603 -0.012204987928271 0 0 0 0 -0.0061583844944835 0 0.24455913901329 0 0 0 0 0 0 0.018422532826662 0 0 0.013712903484702 0.10110645275563 -0.00042365584522486 -0.062646753154695 0.0082892481004819 0.024252690374851 + 1 -0.81621622743214 0.49390788318842 -0.13510196765317 -0.011045500636101 0 0 0 0 -0.0020890964660794 0 0.26294341683388 0 0 0 0 0 0 -0.0083925630897284 0 0 0.01411290327087 0.092506448738277 0.0008763438090682 -0.053346753120422 -0.0057107518659905 -0.13064731564373 + 1 -0.80540541662133 0.46761131635132 -0.098013542485854 -0.0070121213793755 0 0 0 0 0 0 0.20453441143036 0 0 0 0 0 0 -0.015550730749965 0 0 0.025512902997434 0.13680644612759 0.0012763440608978 -0.14484675601125 -0.0033107522176579 0.010352690238506 + 1 -0.79459460581052 0.44166537040537 -0.062337077123487 -0.0035262261517346 0 0 0 0 0 0 0.19082318246365 0 0 0 0 0 0 -0.01305516064167 0 0 0.022012903355062 0.15430645924062 0.006576344370842 -0.14244675263762 0.0068892481504008 0.073352691717446 + 1 -0.78378379499971 0.41607004535059 -0.028053619085463 -0.0014841681113467 0 0 0 0 0 0 0.21973279118538 0 0 0 0 0 0 -0.0079289497807622 0 0 0.01741290371865 0.040706452913582 0.0064763445407152 -0.052846753038466 0.00058924793847837 0.0023526903241873 + 1 -0.7729729841889 0.39082534118696 0.0048557841088193 0 0 0 0 0 0 0 0.16675978899002 0 0 0 0 0 0 -0.0038589551113546 0 0 -0.0357870971784 -0.13709354121238 -0.022623656317592 0.030053246766329 -0.017310752649792 -0.0009473105892539 + 1 -0.76216217337809 0.3659312579145 0.036410084939965 0 0 0 0 0 0 0 0.18963772058487 0 0 0 0 0 0 0 0 0 -0.024887095205486 -0.13729354459792 -0.045723658055067 0.063253249973059 -0.003910752129741 -0.030147309415042 + 1 -0.75135136256728 0.3413877955332 0.066628235888576 0 0 0 0 0 0 0 0.15496288239956 0 0 0 0 0 0 0 0 0 -0.011787096969783 -0.19019354600459 -0.030823655426502 0.10135324671865 0.017589247669093 -0.20194731559604 + 1 -0.74054055175647 0.31719495404306 0.095529189435256 0 0 6.292293255683e-05 0 0 0 0 0.17730142176151 0 0 0 0 0 0 0 0 0 -0.015487096272409 -0.17039355356246 -0.030923657119274 0.12055324390531 0.014289247686975 -0.15214730706066 + 1 -0.72972974094566 0.29335273344408 0.12313189806061 0 0 0.095935180783272 0 0 0 0 0.12749932706356 0 0 0 0 0 0 0 0 0 0.034612902440131 0.1443064538762 0.0044763442128897 -0.13524674996734 -0.022810752619989 0.2602526852861 + 1 -0.71891893013485 0.26986113373627 0.14945531424524 0 0 0.19222097098827 0 0 0 0 0.036020509898663 0 0 0 0 0 0 0 0 0 0.03431290294975 0.077506455592811 0.0023763440549374 -0.011446751654148 -0.02061075263191 0.042452690191567 + 1 -0.70810811932404 0.24672015491961 0.17451839046975 0 0 0.11517268419266 0 0 0 0 -0.012899462133646 0.047586746513844 0 0 0 0 0 0 0 0 0.0031129033304751 -0.11499355453998 0.007476344704628 0.12395324185491 -0.0040107519598678 -0.13654731120914 + 1 -0.69729730851323 0.22392979699412 0.19834007921474 0 0 0.035251531749964 0 1.7466900317231e-06 0 0 -0.025363964959979 0.17251434922218 0 0 0 0 0 0 0 0 -0.00048709660768509 -0.16689355392009 -0.008623656234704 0.1636532433331 0.00328924797941 -0.26004731561989 + 1 -0.68648649770241 0.20149005995979 0.22093933296081 0 0 -0.0034804616589099 0 0.058831561356783 0 0 -0.021560948342085 0.1271647810936 0 0 0 0 0 0 0 0 -0.0016870964318514 -0.099493545480072 0.0053763436153531 0.046653244644403 0.0083892479306087 0.076252688653767 + 1 -0.6756756868916 0.17940094381662 0.24233510418858 0 0 -0.016322674229741 0 0.15306103229523 0 0 -0.014806993305683 0.046425126492977 0 0 0 0 0 0 0 0 0.0041129032615572 -0.1288935514167 0.0052763437852263 0.10215324535966 0.013489248114638 -0.063347308896482 + 1 -0.66486487608079 0.15766244856461 0.26254634537864 0 0 -0.015743028372526 0 0.22671715915203 0 0 -0.0065927244722843 0.0028545362874866 0 0 0 0 0 0 0 0 -0.0088870963081717 -0.06669354904443 -0.0042236563749611 0.062953244894743 0.0053892479045317 -0.028147309087217 + 1 -0.65405406526998 0.13627457420376 0.28159200901159 0 0 -0.010351501405239 0 0.21719300746918 0 0 -0.0031336443498731 -0.013423582538962 0 0 0 0 0 0 0 0 -0.0025870967656374 -0.10389354545623 -0.0022236560471356 0.034853246062994 0.014289247686975 -0.067447311244905 + 1 -0.64324325445917 0.11523732073408 0.29949104756804 0 0 -0.0053398911841214 0 0.18410536646843 0 0 0 -0.015115818940103 0 0 0 0 0 0 0 0 -0.01188709679991 -0.087793548591435 0.0061763431876898 0.040753249078989 -0.0085107517661527 0.015252690354828 + 1 -0.63243244364836 0.094550688155553 0.3162624135286 0 0 -0.0022931022103876 0 0.17885300517082 0 0 0 -0.010725096799433 0 0 0 0 0 0 0 0 -0.0017870971933007 -0.059793551452458 0.0063763447105885 0.015653248876333 -0.018010751460679 0.079052687622607 + 1 -0.62162163283755 0.07421467646819 0.33192505937386 0 0 0 0 0.16898131370544 0 0 0 -0.005837693810463 0 0 0 0 0 0 0 0 -0.0010870965197682 -0.1001935498789 0.010876344516873 0.028153244405985 8.924794383347e-05 -0.035947310738266 + 1 -0.61081082202674 0.054229285671989 0.34649793758443 0 0 0 0 0.14792582392693 0 0 0 -0.0026140084955841 0 0 0 0 0 0 0 0 -0.015187096782029 -0.1052935468033 0.0063763447105885 0.056053247302771 0.003689247998409 -0.019047311507165 + 1 -0.60000001121593 0.034594515766948 0.36000000064091 0 0 0 0 0.12118621170521 0 0 0 0 0 0 0 0 0 0 0 0 -0.0023870971053839 -0.094993551261723 0.015476344153285 0.02055324986577 -0.0034107520477846 0.099752687849104 + 1 -0.58918920040512 0.01531036675307 0.37245020102391 0 0.0016005024081096 0 0 0.12434333562851 0 0 0 0 0 0 0 0 0 0 0 0 -0.015487096272409 -0.11449354607612 0.0011763442307711 0.074553247541189 -0.0011107519967481 -0.027947309426963 + 1 -0.57837838959431 -0.0036231613696476 0.38386749121403 0 0.096228934824467 0 0 0.054626442492008 0 0 0 0 0 0 0 0 0 0 0 0 0.018212903290987 -0.08299354929477 0.015376344323158 0.0053532458841801 0.00078924793342594 0.028352689929307 + 1 -0.5675675787835 -0.022206068601203 0.39427082369186 0 0.13414172828197 0 0 0.0015350170433521 0 0 0 0 0 0 0 0 1.3503349691746e-05 0 0 0 0.012112903408706 -0.099593547172844 0.012776343151927 0.0025532469153404 0.0090892481384799 -0.10724730696529 + 1 -0.55675676797268 -0.040438354941598 0.40367915093803 0 0.069246374070644 0 0 -0.018672101199627 0 0 0 0 0 0 0 0 0.072324976325035 0 0 0 0.0093129032757133 -0.038593546487391 0.010976344347 -0.0063467547297478 0.0104892476229 0.028652690351009 + 1 -0.54594595716187 -0.058320020390831 0.41211142543312 0 0.017592553049326 0 0.014113682322204 -0.019757304340601 0 0 0 0 0 0 0 0 0.15773610770702 0 0 0 0.0073129032971337 -0.064593550749123 0.015476344153285 0.036053244024515 0.0092892477987334 -0.10364731308073 + 1 -0.53513514635106 -0.075851064948903 0.41958659965775 0 -0.0056622386910021 0 0.12503287196159 -0.013525931164622 0 0 0 0 0 0 0 0 0.097588993608952 0 0 0 0.012712903320789 -0.0035935482010245 0.0058763436973095 -0.023246753960848 -0.0033107522176579 0.025152690708637 + 1 -0.52432433554025 -0.093031488615813 0.42612362609251 0 -0.012351076118648 0 0.11872909218073 -0.0082509722560644 0 0 0 0 0 0 0.012349472381175 0 0.030836544930935 0 0 0 0.016412903554738 -0.037193548865616 0.01207634434104 0.019053246825933 -0.0079107518540695 -0.10244730766863 + 1 -0.51351352472944 -0.10986129139156 0.43174145721801 0 -0.010752606205642 0 0.050772178918123 -0.0035070178564638 0 0 0 0 0 0 0.1094037592411 0 -0.0020397072657943 0 0 0 0.017712903209031 0.030806452967227 0.0045763440430164 -0.016246754676104 -0.011410752427764 0.01055269036442 + 1 -0.50270271391863 -0.12634047327615 0.43645904551486 0 -0.0066744363866746 0 0.0084341736510396 -0.0015163091011345 0.04815686494112 0 0 0 0 0 0.10388795286417 0 -0.01319295912981 0 0 0 0.023812904022634 -0.030193549580872 0.012576343491673 0.026353243738413 -0.0029107519658282 -0.13134731259197 + 1 -0.49189190310782 -0.14246903426957 0.44029534346365 0 -0.0033013850916177 0 -0.0088908206671476 0 0.13978426158428 0 0 0 0 0 0.044425655156374 0 -0.013019875623286 0 0 0 0.025112903676927 0.036006451584399 0.00097634363919497 -0.051846753107384 0.011489247786812 0.041552689857781 + 1 -0.48108109229701 -0.15824697437184 0.44326930354498 0 -0.0013714701635763 0 -0.012442322447896 0 0.13858208060265 0 0 0 0 0 0.0073799015954137 0 -0.0086652403697371 0 0 0 0.021412903442979 -0.0093935476616025 0.01237634383142 0.044653248041868 0.013189247692935 -0.1755473157391 + 1 -0.4702702814862 -0.17367429358294 0.44539987823947 0.0030656999442726 0 0 -0.0096218045800924 0 0.18833549320698 0 0 0 0 0 -0.0077794678509235 0 -0.0045090229250491 0 0 0 0.022612904198468 -0.014093547128141 0.0094763431698084 0.061953250318766 -0.0081107524456456 -0.16874730493873 + 1 -0.45945947067539 -0.18875099190288 0.44670602002772 0.12636050581932 0 0 -0.0055486336350441 0 0.11498866230249 0 0 0 0 0 -0.010887031443417 0 -0.0019495403394103 0 0 0 0.040712905116379 0.071606452576816 0.0063763447105885 -0.038346753455698 -0.0038107522996143 -0.03504731040448 + 1 -0.44864865986458 -0.20347706933166 0.44720668139032 0.16548715531826 0 0 -0.0025971501599997 0 0.030592679977417 0 0 0 0 0 -0.0084190787747502 0 0 0.053775411099195 0 0 0.020712903700769 0.052206452004611 0.0067763440310955 -0.020446753129363 -0.0027107520727441 0.13395269308239 + 1 -0.43783784905377 -0.21785252586928 0.44692081480789 0.083070278167725 0 0.00069552229251713 0 0 -0.0093372892588377 0 0 0 0 0 -0.0048550544306636 0 0 0.17381578683853 0 0 0.023612902499735 0.031806453131139 0.0089763440191746 0.01885324344039 -0.0023107520537451 0.0600526900962 + 1 -0.42702703824295 -0.23187736151574 0.44586737276102 0.020175436511636 0 0.10747677832842 0 0 -0.020309561863542 0 0 0 0 0 -0.0022725064773113 0 0 0.12343865633011 0 0 0.054112904705107 0.063506453298032 0.013076344504952 -0.10814675316215 -0.00681075186003 0.09105268958956 + 1 -0.41621622743214 -0.24555157627104 0.44406530773032 -0.0077522136271 0 0.17133423686028 0 0 -0.018001658841968 0 0 0 0 0.00055644899839535 0 0 0 0.043845765292645 0 0 0.05091290269047 0.047706454060972 0.011776342988014 -0.072146752849221 0.0052892480744049 -0.058047308586538 + 1 -0.40540541662133 -0.25887517013517 0.4415335721964 -0.015503321774304 0 0.093689776957035 0 0 -0.011593883857131 0 0 0 0 0.085981898009777 0 0 0 0.0017423888202757 0 0 0.063712903298438 0.080906453542411 -0.001023655757308 -0.16354675218463 0.0059892478166148 0.03335269074887 + 1 -0.39459460581052 -0.27184814310814 0.43829111863984 -0.013250176794827 0 0.025813156738877 0 0 -0.0052539245225489 0 0 0 0 0.13706727325916 0 0 0 -0.013717586174607 0 0 0.062212903983891 0.095306451432407 -0.00042365584522486 -0.17324675247073 -0.001310752122663 -0.022447309456766 + 1 -0.38378379499971 -0.28447049518995 0.43435689954127 -0.008134912699461 0 -0.0056234514340758 0 0 0.006489459425211 0 0 0 0 0.074951559305191 0 0 0 -0.015004207380116 0 0 0.051512901671231 0.058706454001367 0.0025763437151909 -0.10944675281644 -0.011610752088018 -0.15204730536789 + 1 -0.3729729841889 -0.2967422263806 0.42974986738128 -0.0039911866188049 0 -0.015256236307323 0 0 0.11816956847906 0 0 0 0 0.020650375634432 0 0 0 -0.010505273938179 0 0 0.053812903352082 0.1143064526841 -0.011323656188324 -0.19274675473571 -0.012810751912184 0.055052691139281 + 1 -0.36216217337809 -0.30866333668009 0.42448897464048 0 0 -0.013806872069836 0 0 0.12816107273102 0 0 0 0 -0.0044988198205829 0 0 0 -0.0056656016968191 0 0 0.045312904752791 0.049706450663507 0.0063763447105885 -0.060146752744913 0.004089248017408 0.00065269041806459 + 1 -0.35135136256728 -0.32023382608842 0.41859317379946 0 0 -0.008765147998929 0 0 0.15216007828712 0 0 0 0 -0.012204997241497 0 0 0 -0.0025189006701112 0 0 0.041512903757393 0.10200645308942 0.0028763441368937 -0.084046754986048 -0.0025107521796599 0.19385269377381 + 1 -0.34054055175647 -0.33145369460559 0.41208141733884 0.00042675601434894 0 -0.0044077797792852 0 0 0.12315040826797 0 0 0 0 -0.011045484803617 0 0 0 0 0 0 0.043612902052701 0.092406454496086 0.0044763442128897 -0.044746753294021 -0.016510752146132 0.060752690769732 + 1 -0.32972974094566 -0.34232294223159 0.40497265773921 0.12098247557878 0 -0.001855208654888 0 0 0.045295763760805 0 0 0 0 -0.0070121022872627 0 0 0 0 0 0 0.047312905080616 0.0077064521610737 0.011176344007254 0.020053248852491 -0.019710752298124 -0.024547311477363 + 1 -0.31891893013485 -0.35284156896643 0.39728584748118 0.20731872320175 0 0 0 0 -0.00076612085103989 0 0 0 0 -0.0035262131132185 0 0.017642103135586 0 0 0 0 0.04471290204674 0.050606450997293 0.006076343357563 -0.032946752384305 -0.0031107520917431 0.017152690328658 + 1 -0.30810811932404 -0.36300957481012 0.38903993904535 0.11678945273161 0 0 0 0 -0.01625781878829 0 0 0 0 -0.0014841614756733 0 0.15629108250141 0 0 0 0 0.055312902666628 0.081206451170146 0.005676344037056 -0.071046752855182 -0.001310752122663 0.070552689023316 + 1 -0.29729730851323 -0.37282695976264 0.38025388491233 0.033387824892998 0 0 0 0 -0.016767358407378 0.028632424771786 0 0 0 0 0 0.14841136336327 0 0 0 0 0.052412902005017 0.038706452585757 0.01857634447515 -0.032746752724051 -0.0019107520347461 -0.017247310839593 + 1 -0.28648649770241 -0.38229372382399 0.37094663756271 -0.0058099492453039 0 0 0 0 -0.011784705333412 0.17964339256287 0 0 0 0 0 0.063465222716331 0 0 0 0 0.048512903042138 0.039306451566517 0.0098763443529606 -0.030746752396226 0.005889247986488 -0.020847308449447 + 1 -0.2756756868916 -0.39140986699419 0.36113714947711 -0.018164224922657 0 0 0 0 -0.005407671444118 0.15981185436249 0 0 0 0 0 0.010542716830969 0 0 0 0 0.053912905044854 0.058206452988088 0.0033763442188501 -0.060346753336489 0.0084892477607355 0.01635269029066 + 1 -0.26486487608079 -0.40017538927323 0.35084437313612 -0.016777858138084 0 0 0 0 -0.0026109907776117 0.18218821287155 0 0 0 0 0 -0.011113525368273 0 0 0 0 0.045912903733552 0.074306453578174 -0.0034236563369632 -0.05854675360024 0.016989248688333 0.071852688677609 + 1 -0.25405406526998 -0.4085902906611 0.34008726102035 -0.010774576105177 0 0 0 0 0 0.17693194746971 0 0 0 0 0 -0.015552902594209 0 0 0 0 0.04131290409714 0.071206453256309 0.0021763434633613 -0.045946753118187 -0.0020107520977035 0.024952690117061 + 1 -0.24324325445917 -0.41665457115781 0.32888476561041 -0.0054639861918986 0 0 0 0 0 0.17483820021152 0 0 0 0 0 -0.012027255259454 0 0 0 0 0.039012902416289 0.069406452588737 -0.001923656091094 -0.024946752935648 -0.003910752129741 -0.0061473092064261 + 1 -0.23243244364836 -0.42436823076337 0.31725583938689 -0.0023150618653744 0 0 0 0 0 0.12542612850666 0 0 0 0 0 -0.0069357920438051 0 0 0 0 0.035812904126942 0.060206453315914 0.0042763436213136 0.026653248816729 0.00018924794858322 -0.099747306667268 + 1 -0.22162163283755 -0.43173126947776 0.3052194348304 0 0 0 0 0 0 0.13749043643475 0 0 0 0 0 -0.0032464377582073 0 0 0 0 0.029112902469933 0.11720644962043 0.0043763434514403 0.0016532465815544 0.0012892479426228 0.0097526903264225 + 1 -0.21081082202674 -0.43874368730098 0.29279450442154 0 0 0 0 0 0 0.14846354722977 0 0 0 0 0 0 0 0 0 0 0.031112902797759 0.03860645275563 0.014176344498992 0.043153245002031 -0.0030107522616163 -0.070447309873998 + 1 -0.20000001121593 -0.44540548423305 0.28000000064091 0 0 0 0 0 0 0.19279418885708 0 0 0 0 0 0 0 0 0 0 0.022912903688848 0.10360645037144 0.0073763430118561 0.010053247213364 0.00078924793342594 0.13845268730074 + 1 -0.18918920040512 -0.45171666027396 0.26685487596912 0 0 0 0 0 0 0.21137630939484 0 0 0 0 0 0 0 0 0 0 0.015312903560698 0.082306454889476 0.0033763442188501 0.041253250092268 0.004089248017408 0.18055269215256 + 1 -0.17837838959431 -0.4576772154237 0.25337808288678 0 0 0 0.043020330369473 0 0 0.14208625257015 0 0 0 0 0 0 0 0 0 0 0.0055129032116383 0.077706451527774 -0.0071236561052501 -0.037946753203869 0.0025892478879541 0.2391526857391 + 1 -0.1675675787835 -0.46328714968228 0.23958857387448 0 0 0 0.13905262947083 0 0 0.041933041065931 0 0 0 0 0 0 0 0 0 0 0.023912903852761 0.15820645075291 -0.025423657149076 -0.1429467536509 0.0025892478879541 0.15375268552452 + 1 -0.15675676797268 -0.46854646304971 0.22550530141283 0 0 0 0.098750926554203 0 0 -0.012082259170711 0 0 0.018220633268356 0 0 0 0 0 0 0 0.011012903414667 0.10640645306557 -0.010123656247742 -0.062346752732992 -0.0088107521878555 -0.021447311155498 + 1 -0.14594595716187 -0.47345515552597 0.21114721798243 0 0 0 0.03507661446929 0 0 -0.026482511311769 0 0 0.11431851238012 0 0 0 0 0 0 0 -0.011787096969783 -0.048293546773493 0.00067634414881468 0.074753243476152 -0.0072107521118596 -0.055747306905687 + 1 -0.13513514635106 -0.47801322711106 0.19653327606389 0 0.017292505130172 0 0.0013939110795036 0 0 -0.024222373962402 0 0 0.099139772355556 0 0 0 0 0 0 0 -0.0036870967596769 -0.067493547685444 0.0023763440549374 0.068653244525194 -0.010410752263851 -0.10984730627388 + 1 -0.12432433554025 -0.482220677805 0.1816824281378 0 0.12800069153309 0 -0.01097406912595 0 0 -0.015291653573513 0 0 0.04024151340127 0 0 0 0 0 0 0 0.016112903133035 -0.025893547572196 0.00077634397894144 -0.031946752220392 -0.024710751255043 0.090352692641318 + 1 -0.11351352472944 -0.48607750760778 0.16661362668478 0 0.11605546623468 0 -0.012003365904093 0 0 -0.0082694683223963 0 0 0.0054445695132017 0 0 0 0 0 0.0059029059484601 0 -0.016587096266448 -0.076993544586003 0.012976344674826 0.1091532446444 -0.021610752795823 -0.16014730837196 + 1 -0.10270271391863 -0.48958371651939 0.15134582418542 0 0.048352032899857 0 -0.0084042195230722 0 0 -0.0028834280092269 0 0 -0.0083946632221341 0 0 0 0 0 0.10000795125961 0 -0.02848709654063 -0.032693547196686 0.0011763442307711 0.096353251487017 0.0047892479924485 -0.094947307370603 + 1 -0.09189190310782 -0.49273930453984 0.13589797312033 0 0.0073072644881904 0.004996741656214 -0.0045324815437198 0 0 0 0 0 -0.010818615555763 0 0 0 0 0 0.11038105934858 0 -0.03128709550947 -0.040093549527228 0.0051763439550996 0.11825324967504 0.0080892479745671 -0.25064730551094 + 1 -0.081081092297009 -0.49554427166914 0.12028902597011 0 -0.009253709577024 0.11014425009489 -0.0020151205826551 0 0 0 0 0 -0.0081188511103392 0 0 0 0 0 0.051077321171761 0 -0.028087097220123 0.020306452177465 -0.0021236562170088 0.028753247112036 -0.019210751284845 0.077652693726122 + 1 -0.070270281486198 -0.49799861790727 0.10453793521537 0 -0.012408400885761 0.12837927043438 0 0 0 0 0 0.0099470904096961 -0.004590333905071 0 0 0 0 0 0.010568294674158 0 -0.039187095128 -0.094093550927937 0.0050763441249728 0.22715326026082 -0.021210751612671 -0.30834731366485 + 1 -0.059459470675387 -0.50010234325423 0.088663653336703 0 -0.0094509832561016 0.061017215251923 0 1.7468818214184e-06 0 0 0 0.1329403668642 -0.0021164785139263 0 0 0 0 0 -0.0067023267038167 0 -0.033887098543346 0.002206452190876 0.0094763431698084 0.092953253537416 0.002489247941412 -0.019747308455408 + 1 -0.048648659864576 -0.50185544771004 0.07268513281472 0 -0.0053962054662406 0.013384091667831 0 0.058831807225943 0 0 0 0.13926292955875 0 0 0 0 0 0 -0.010917749255896 0 -0.044387097470462 -0.085793544538319 0.0021763434633613 0.14515324309468 -0.004710752167739 -0.266447304748 + 1 -0.037837849053766 -0.50325793127469 0.056621326130022 0 -0.0025067001115531 -0.0071999179199338 0 0.14035293459892 0 0 0 0.062757529318333 0 0 0 0 0 0 -0.0088573601096869 0 -0.019987096078694 0.0048064524307847 0.0029763439670205 0.027753245085478 -0.0056107520358637 0.03505268972367 + 1 -0.027027038242955 -0.50430979394817 0.040491185763213 0 0.053441412746906 -0.012465350329876 0 0.089743755757809 0 0 0 0.012170788832009 0 0 0 0 0 0 -0.0052667763084173 0 -0.026087096892297 -0.04249354917556 0.0045763440430164 0.039753247052431 -0.019710752298124 -0.044147307984531 + 1 -0.016216227432144 -0.50501103573049 0.024313664194895 0 0.14021460711956 -0.010284850373864 0 0.029239932075143 0 0 0 -0.0091062942519784 0 0 0 0 0.0018005651654676 0 -0.0025229994207621 0 -0.039087097160518 -0.041293547488749 0.005676344037056 0.12005325034261 -0.015110752661712 -0.17924730386585 + 1 -0.0054054166213331 -0.50536165662166 0.0081077139056723 0 0.092748634517193 -0.0061801802366972 0 -0.0010622846893966 0 0 0 -0.014036962762475 0 0 0 0 0.10825754702091 0 0 0 -0.02738709654659 0.0081064521800727 0.00407634396106 0.039853248745203 -0.025110752438195 -0.0091473096981645 + 1 0.0054053941894776 -0.50536165662166 -0.008107712623852 0 0.031126981601119 -0.0029839819762856 0 -0.011565917171538 0 0.028552377596498 0 -0.011202690191567 0 0 0 0 0.15090943872929 0 0 0 -0.03188709821552 -0.042693548835814 0.0083763431757689 0.05095325037837 0.0030892478534952 0.014852690343105 + 1 0.016216205000289 -0.50501103573049 -0.024313662913075 0 -0.00027817318914458 0 0 -0.011690891347826 0 0.10350869596004 0 -0.0065927179530263 0 0 0 0 0.077902160584927 0 0 0 -0.065387095324695 -0.029893548227847 -0.011423656251281 0.11095324531198 0.010989247704856 0.1039526918903 + 1 0.027027015811099 -0.50430979394817 -0.040491184481393 0 -0.011387062259018 0 0.017292505130172 -0.007877248339355 0 0.076298668980598 0 -0.0031336380634457 0 0 0 0 0.01979162171483 0 0 0 -0.054587095044553 -0.038393546827137 -0.0098236562334932 0.07965325191617 0.0057892481563613 0.071052690036595 + 1 0.03783782662191 -0.50325793127469 -0.056621324848202 0 -0.011802065186203 0 0.12800069153309 -0.0041351648978889 0 0.027854926884174 0 0 1.9652418359328e-06 0 0 0 -0.0063700182363391 0 0 0 -0.047287098132074 -0.025793549604714 -0.0038236561231315 0.066753249615431 0.004089248017408 0.1022526929155 + 1 0.048648637432721 -0.50185544771004 -0.0726851315329 0 -0.008052596822381 0 0.11605546623468 -0.0018002366414294 0 0.0017126569291577 0 0 0.066185779869556 0 0 0 -0.013894959352911 0 0 0 -0.065787094645202 -0.0054935486987233 -0.016723656095564 0.030953247100115 -0.0070107524516061 0.095652692951262 + 1 0.059459448243532 -0.50010234325423 -0.088663652054883 0 -0.0028645200654864 0 0.048352032899857 0 0 -0.0080541670322418 0 0 0.15789704024792 0 0 0 -0.012096680700779 0 0 0 -0.051787096075714 -0.030793548561633 -0.014523656107485 0.094953242689371 -0.0089107520179823 -0.056247307918966 + 1 0.070270259054343 -0.49799861790727 -0.10453793393355 0 0.082330644130707 0 0.0073072644881904 0 0 -0.0090694855898619 0 0 0.10096172243357 0 0 0 -0.007508740760386 0 0 0 -0.048587097786367 0.04140645172447 -0.0070236562751234 -0.040346752852201 -0.029810751904733 0.063552689738572 + 1 0.081081069865153 -0.49554427166914 -0.12028902468829 0 0.11737401038408 0 -0.009253709577024 0 0 -0.0064350459724665 0 0 0.032894920557737 0 0 0 -0.0037140580825508 0 0.014120560139418 0 -0.046387097798288 -0.042093546129763 -0.0041236560791731 0.059353243559599 -0.010510752093978 -0.18344731535763 + 1 0.091891880675964 -0.49273930453984 -0.13589797183851 0 0.060590572655201 2.4012949066087e-26 -0.012408400885761 0 0 -0.0035026066470891 0 0 -0.0011950702173635 0 0 0 -0.0015429038321599 0 0.15219141542912 0 -0.053587096743286 0.0074064522050321 -0.015923656057566 0.002253245562315 0.0090892481384799 -0.063547312282026 + 1 0.10270269148678 -0.48958371651939 -0.1513458229036 0 0.015393483452499 0.084276184439659 -0.0094509832561016 0 0 -0.0015683997189626 0 0 -0.013011656701565 0 0 0 0 0 0.15163862705231 0 -0.041287097148597 -0.031393547542393 -0.0029236562550068 0.088153246790171 0.01738924800884 -0.19314731564373 + 1 0.11351350229759 -0.48607750760778 -0.16661362540296 0 -0.0049544586800039 0.2446226477623 -0.0053962054662406 0 0 0 0 0 -0.013152251951396 0.0011044126003981 0 0 0 0 0.066562041640282 0 -0.029687098227441 -0.078893546946347 -0.0059236562810838 0.017553243786097 -0.0053107520798221 -0.036047308705747 + 1 0.1243243131084 -0.482220677805 -0.18168242685598 0 -0.01080719102174 0.16756856441498 -0.0025067604146898 0 0 0 0 0 -0.0088619040325284 0.10258268564939 0 0 0 0 0.012005048803985 0 -0.021687096916139 -0.032093548215926 -0.006923656212166 0.062953244894743 -0.0041107522556558 -0.077147311531007 + 1 0.13513512391921 -0.47801322711106 -0.19653327478207 0.02777655608952 -0.0094085298478603 0.057876385748386 0 0 0 0 0 0 -0.0046520605683327 0.15266855061054 0 0 0 0 -0.010630848817527 0 -0.028887095861137 -0.02389354724437 -0.0087236562394537 0.0098532475531101 0.0017892479081638 0.061852690763772 + 1 0.14594593473002 -0.47345515552597 -0.21114721670061 0.1495973020792 -0.0058401320129633 0.00094535760581493 0 0 0 0 0 0 -0.0020252661779523 0.081088602542877 0 7.5448255643096e-08 0 0 -0.015581800602376 0 -0.025487097911537 -0.00049354787915945 -0.011723656207323 0.024553250521421 0.00038924789987504 -0.0054473103955388 + 1 0.15675674554083 -0.46854646304971 -0.22550530013101 0.12429348379374 -0.002888711867854 -0.019582450389862 0 0 0 0 0 0 0 0.021482115611434 0 0.066801764070988 0 0 -0.01223857421428 0 -0.02568709757179 -0.0035935482010245 -0.0018236562609673 0.02225324884057 -0.0075107525335625 -0.031247309409082 + 1 0.16756755635164 -0.46328714968228 -0.23958857259266 0.049149297177792 -0.001200036262162 -0.020836120471358 0 0 0 0.0026805191300809 0 0 0 -0.0057318191975355 0 0.17526826262474 0 0 -0.007129117846489 0 -0.019887096248567 -0.010493547655642 -0.0091236562293489 0.0025532469153404 0.0011892479233211 -0.095247312448919 + 1 0.17837836716245 -0.4576772154237 -0.25337808160496 0.0058260434307158 0 -0.014399533160031 0 0 0 0.079301044344902 0 0 0 -0.013821039348841 0 0.11593579500914 0 0 -0.003362531773746 0 -0.029887097887695 -0.024893549270928 -0.012123656226322 0.053453247994184 0.0093892476288602 -0.051047309301794 + 1 0.18918917797326 -0.45171666027396 -0.2668548746873 -0.011150880716741 0 -0.0076954429969192 0.0011043065460399 0 0 0.097848139703274 0 0 0 -0.012263779528439 0 0.03890872746706 0 0 0 0 -0.036987095139921 0.0021064523607492 -0.016323656309396 0.029853243380785 0.0075892478926107 -0.0091473096981645 + 1 0.19999998878407 -0.44540548423305 -0.27999999935909 -0.013848732225597 0 -0.0033972456585616 0.10258162766695 0 0 0.047784235328436 0 0 0 -0.0076978113502264 0 -0.00034771647187881 0 0 0 0 -0.037287096492946 0.020606452599168 -0.013623656239361 -0.017846751958132 -0.0050107521237805 0.12615268770605 + 1 0.21081079959488 -0.43874368730098 -0.29279450313971 -0.010243374854326 0 0 0.15266886353493 0 0 0.011053452268243 0 0 0 -0.0038390003610402 0.00055644899839535 -0.014233827590942 0 0 0 0 -0.036187096498907 0.0076064523309469 -0.011723656207323 0.018653247505426 -0.0022107519907877 0.023652690462768 + 1 0.22162161040569 -0.43173126947776 -0.30521943354858 -0.0057357028126717 0 0 0.081089183688164 0 0 -0.0050355666317046 0 0 0 -0.0016052267747 0.085981898009777 -0.014752581715584 0 0 0 0 -0.040587096475065 0.023506452329457 -0.021523656323552 0.022353250533342 0.016689247335307 -0.076547308824956 + 1 0.2324324212165 -0.42436823076337 -0.31725583810507 -0.002625027904287 0 0 0.021482426673174 0 0.00028454218409024 -0.009330440312624 0 0 0 0 0.13706727325916 -0.010065745562315 0 0 0 0 -0.032887096516788 -0.013293548487127 -0.017923655919731 0.014253247529268 0.016589247505181 -0.096347308717668 + 1 0.24324323202732 -0.41665457115781 -0.32888476432859 0 0 0 -0.0057317009195685 0 0.080655962228775 -0.0078330878168344 0 0 0 0 0.074951559305191 -0.0053311996161938 0 0 0 0 -0.044587097130716 -0.039993547834456 -0.019323656335473 0.11035325005651 -0.022410751436837 -0.097647308371961 + 1 0.25405404283813 -0.4085902906611 -0.34008725973853 0.00062593474285677 0 0 -0.01382102444768 0 0.13821229338646 -0.0047573610208929 0 0 0 0 0.020650375634432 -0.0023370909038931 0 0 0 0 -0.049287098459899 0.028606452979147 -0.027623657137156 0.03745324537158 -0.014610751648434 0.037952690385282 + 1 0.26486485364894 -0.40017538927323 -0.3508443718543 0.096728548407555 0 0 -0.012263810262084 0 0.077859088778496 -0.0023153687361628 0 0 0 0 -0.0044988198205829 0 0 0 0 0 -0.025887097232044 -0.1584935458377 0.010576343163848 0.28665323927999 0.0081892478046939 -0.28344732429832 + 1 0.27567566445975 -0.39140986699419 -0.36113714819529 0.15420092642307 0 0 -0.0076978439465165 0 0.022258253768086 0 0 0 0 0 -0.012204997241497 0 0 0.0040207784622908 0 0 -0.03188709821552 -0.1056935461238 -0.016523656435311 0.082253251224756 0.012089247698896 0.23425269220024 + 1 0.28648647527056 -0.38229372382399 -0.37094663628089 0.084321089088917 0 0 -0.0038390222471207 0 -0.0038734152913094 0 0 0 0 0 -0.011045484803617 0 0 0.11895155161619 0 0 -0.011487097479403 0.15390645246953 -0.02732365578413 -0.33114675804973 -0.0015107520157471 0.46645268891007 + 1 0.29729728608137 -0.37282695976264 -0.38025388363051 0.023231994360685 0 0 -0.0016052387654781 0 -0.012109502218664 0 0.021616401150823 0 0 0 -0.0070121022872627 0 0 0.14677220582962 0 0 -0.014587095938623 0.12170645128936 -0.021123656071723 -0.25024675950408 -0.0087107523577288 0.30875268671662 + 1 0.30810809689218 -0.36300957481012 -0.38903993776353 -0.0050610406324267 0 8.3067540401771e-08 0 0 -0.011185213923454 0 0.16000151634216 0 0 0 -0.0035262131132185 0 0 0.071676351130009 0 0 -0.011187096126378 -0.021293547935784 0.013976342976093 0.075053248554468 -0.0037107520038262 -0.023047308437526 + 1 0.31891890770299 -0.35284156896643 -0.39728584619936 -0.013730604201555 0 0.073483273386955 0 0 -0.0071830214001238 0 0.14506870508194 0 0 0 -0.0014841614756733 0 0 0.016580177471042 0 0 -0.010987096466124 -0.010493547655642 0.0095763429999352 -0.01044675335288 -0.004710752167739 -0.013647309504449 + 1 0.3297297185138 -0.34232294223159 -0.40497265645739 -0.012426199391484 0 0.19279517233372 0 0 -0.0036426351871341 0 0.060439497232437 0.0062459269538522 0 0 0 0 0 -0.0075533492490649 0 0 -0.02088709641248 -0.050193549133837 -0.0023236563429236 0.046753246337175 -0.017410752479918 -0.12824730481952 + 1 0.34054052932461 -0.33145369460559 -0.41208141605701 -0.007888650521636 0 0.12752863764763 0 0 -0.0015433629741892 0 0.0091338297352195 0.13768030703068 0 0 0 0 0 -0.013995659537613 0 0 0.0065129032736877 0.018406452611089 0.0043763434514403 -0.090446751564741 -0.023310751770623 0.15285268519074 + 1 0.35135134013542 -0.32023382608842 -0.41859317251764 -0.0039670118130744 0.0024526501074433 0.042799100279808 0 0 0 0 -0.011567215435207 0.16047409176826 0 0 0 0 0 -0.011749630793929 0 0 -0.017287096939981 -0.054993544705212 0.003176343627274 0.041453246027231 0.011889248038642 -0.00044730957597494 + 1 0.36216215094623 -0.30866333668009 -0.42448897335866 -0.0016696940874681 0.10108884423971 -0.00038268772186711 0 0 0 0 -0.015510492026806 0.076271519064903 0 0 0 0 0 -0.0071360412985086 0 0 -0.0055870963260531 -0.018493547104299 -0.0011236565187573 -0.0085467547178268 0.015189248020761 0.18875269684941 + 1 0.37297296175705 -0.2967422263806 -0.42974986609946 0 0.13238954544067 -0.01565725915134 0 0 0 0 -0.011813691817224 0.016730114817619 0 0 0 0 0 -0.0034730527549982 0.041677042841911 0 0.0019129030406475 -0.038693548180163 -0.00032365601509809 -4.6752393245697e-05 -0.00031075207516551 0.11815269384533 + 1 0.38378377256786 -0.28447049518995 -0.43435689825945 0 0.066455982625484 -0.016227813437581 0 0 0 0 -0.0067452238872647 -0.0089998971670866 0 0 0 0 0 0 0.17081795632839 0 -0.0021870965138078 -0.0014935480430722 -0.011423656251281 0.028053250163794 8.924794383347e-05 0.13765268865973 + 1 0.39459458337867 -0.27184814310814 -0.43829111735802 0 0.016140213236213 -0.0098451487720013 0 0 0 0 -0.0031334289815277 -0.015581687912345 0 0 0 0 0 0 0.13085924088955 0 -0.012287096120417 -0.031593547202647 -0.0014236560091376 0.042453248053789 -0.0017107521416619 -0.05474731232971 + 1 0.40540539418948 -0.25887517013517 -0.44153357091458 0 -0.0062018162570894 0.10811647772789 0 0 0 0 0 -0.012856062501669 0 0 0 0 0 0 0.049078978598118 0 -0.020487097091973 -0.050293547101319 -0.0031236563809216 0.083953250199556 0.00098924792837352 -0.12484730686992 + 1 0.41621620500029 -0.24555157627104 -0.4440653064485 0 -0.012402662076056 0.16706095635891 0 0 0 0 0 -0.0061247227713466 0 0 0 0 0 0 0.0040129679255188 0 -0.0066870963200927 0.034006453119218 -0.010323656199034 -0.067946752533317 0.0021892479853705 0.20965269301087 + 1 0.4270270158111 -0.23187736151574 -0.4458673714792 0 -0.010600126348436 0.090098448097706 0 0 0 0 0 0.092498958110809 0 0 0 0 0 0 -0.01310474704951 0 -0.02568709757179 -0.034993548877537 -0.015623656101525 0.092453245073557 0.010789248044603 -0.083147308789194 + 1 0.43783782662191 -0.21785252586928 -0.44692081352607 0 0.0093702841550112 0.023869017139077 0 0 0 0 0 0.13414172828197 0 0 0 0 0 0 -0.015217265114188 0 -0.034987098537385 -0.014693547971547 -0.021223655901849 0.061453249305487 0.013389248284511 -0.2369472971186 + 1 0.44864863743272 -0.20347706933166 -0.4472066801085 0 0.1374693363905 -0.0063686883077025 0 0 0 0 0 0.069246374070644 0 0 0 0 1.2008145858999e-05 0 -0.010944607667625 0 -0.021287097595632 0.0089064522180706 -0.017023656051606 -0.023146752268076 0.013789247605018 -0.078247307799757 + 1 0.45945944824353 -0.18875099190288 -0.4467060187459 0 0.13356995582581 -0.015356711111963 0 0 0 0 0 0.017592553049326 0 0 0 0 0.06429036706686 0 -0.0060129929333925 0 -0.030487096868455 -0.014193546958268 -0.017123656347394 0.047353249043226 0.00018924794858322 0.023852690123022 + 1 0.47027025905434 -0.17367429358294 -0.44539987695765 0 0.057118438184261 -0.013626421801746 0.0040210401639342 0 0 0 0 -0.0056622386910021 0 0 0 0 0.14020979404449 0 -0.0027119813021272 0 -0.042687098495662 -0.0022935476154089 -0.020723655819893 0.055353250354528 0.0013892479182687 0.095052690245211 + 1 0.48108106986515 -0.15824697437184 -0.44326930226316 0 0.009488333016634 -0.0085531240329146 0.11895248293877 0 0 0 0 -0.012351076118648 0 0 0 0 0.086744964122772 0 0 0 -0.017187097109854 0.080606455914676 -0.026223655790091 -0.095046754926443 -0.011210751836188 0.24795268569142 + 1 0.49189188067596 -0.14246903426957 -0.44029534218182 0 -0.01000221259892 -0.0042655561119318 0.14677180349827 0 0 0 0 -0.010752606205642 0.0067461780272424 0 0 0 0.027409762144089 0 0 0 -0.043387095443904 0.013006452238187 -0.0074236562941223 0.03295324370265 -0.014210752327926 -0.0089473100379109 + 1 0.50270269148678 -0.12634047327615 -0.43645904423304 0 -0.013997609727085 -0.0017835852922872 0.071675792336464 0 0 0 0 -0.0066744363866746 0.11429480463266 0 0 0 -0.0018132763216272 0 0 0 -0.014087096787989 -0.10489354748279 0.028776343911886 0.20875324681401 -0.00061075203120708 -0.30814731027931 + 1 0.51351350229759 -0.10986129139156 -0.43174145593619 0 -0.010824510827661 0 0.016579894348979 0.0021460687275976 0 0 0 -0.0033013850916177 0.12614978849888 0 0 0 -0.011727117933333 0 0 0 -0.022487097419798 -0.0638935463503 0.0048763435333967 0.085353244096041 0.011989247868769 -0.43564730789512 + 1 0.5243243131084 -0.093031488615813 -0.42612362481069 0 -0.0062421360053122 0 -0.0075534516945481 0.088452741503716 0 0 0 -0.0013714701635763 0.058374084532261 0 0 0 -0.011573190800846 0 0 0 0.0099129031877965 0.14590645115823 -0.021523656323552 -0.26314675435424 -0.0051107519539073 0.32535269949585 + 1 0.53513512391921 -0.075851064948902 -0.41958659837593 0 0.050519626587629 0 -0.013995666056871 0.11584085226059 0 0 0 0 0.012078051455319 0 0 0 -0.0077023864723742 0 0 0 0.0036129031796008 0.11790645401925 -0.02732365578413 -0.18784674629569 -0.0058107521617785 0.11255268845707 + 1 0.54594593473002 -0.058320020390831 -0.4121114241513 0 0.14021460711956 0 -0.011749600991607 0.058148983865976 0 0 0 0 -0.0076598017476499 0 0 0 -0.0040079848840833 0 0.0030658126343042 0 -0.016887097619474 -0.08299354929477 -0.00062365643680096 0.10565324500203 0.0095892482204363 -0.24984732177109 + 1 0.55675674554083 -0.040438354941598 -0.40367914965621 0 0.092748634517193 0 -0.0071360059082508 0.014122685417533 0 0 0 0 -0.012477427721024 0 0 0 -0.0017329071415588 0 0.12636105716228 0 -0.0057870969176292 -0.050393548794091 -0.0076236561872065 0.075053248554468 0.0042892479104921 -0.18254731502384 + 1 0.56756755635164 -0.022206068601203 -0.39427082241004 0 0.031126981601119 0 -0.0034730304032564 -0.0054265889339149 0 0 0.030862841755152 0 -0.010122697800398 0 0 0 0 0 0.16548693180084 0 -0.0066870963200927 -0.099193547852337 0.0012763440608978 0.084453243762255 -0.010610751924105 -0.032047308050096 + 1 0.57837836716245 -0.0036231613696475 -0.3838674899322 0 -0.00027817318914458 0 0 -0.010852329432964 0 0 0.16621923446655 0 -0.0060191727243364 0 0 0 0 0 0.083069980144501 0 0.018612903542817 -0.030793548561633 0.0016763433814049 -0.032246753573418 -0.0034107520477846 0.16925269458443 + 1 0.58918917797326 0.01531036675307 -0.37245019974209 0 -0.011387062259018 0.00035563000710681 0 -0.0092751104384661 0 0 0.13810387253761 0 -0.0028834280092269 0 0 0 0 0 0.020175265148282 0 -0.0045870970934629 -0.039693546481431 0.0030763437971473 0.017853248864412 0.016789247165434 0.058652688749135 + 1 0.59999998878407 0.034594515766949 -0.35999999935909 0 -0.011802065186203 0.10081872344017 0 -0.0056944275274873 0 0 0.054610330611467 0 0 0 0 0 0 0 -0.0077522699721158 0 0.0062129032448865 -0.0081935478374362 0.0058763436973095 -0.051746753160842 0.0091892479686067 0.24165268335491 + 1 0.61081079959488 0.054229285671989 -0.34649793630261 0 -0.008052596822381 0.17276559770107 0 -0.0027938217390329 0 0 0.0064733815379441 0 0 0.0016005024081096 0 0 0 0 -0.015503327362239 0 -0.0093870973214507 -0.08979354519397 0.0080763436853886 0.088053245097399 -0.018010751460679 -0.10724730696529 + 1 0.62162161040569 0.07421467646819 -0.33192505809204 0 -0.0042649595998228 0.097324542701244 0 0 0 0 -0.012389867566526 0 0 0.096228934824467 0 0 0 0 -0.013250158168375 0 0.0053129033185542 -0.0081935478374362 0.014976343140006 -0.0060467533767223 -0.015910751302727 0.14865268860012 + 1 0.6324324212165 0.094550688155554 -0.31626241224678 0.028872592374682 -0.0018696727929637 0.027823185548186 0 0 0 0 -0.015387481078506 0 0 0.13414172828197 0 0 0 0 -0.0081348968669772 0 0.0047129031736404 -0.052293551154435 0.021276343613863 0.0077532455325127 0.011589247616939 0.18645268771797 + 1 0.64324323202732 0.11523732073408 -0.29949104628622 0.1349770128727 0 -0.0048416242934763 0 0 0 0 -0.01138152834028 0 0 0.069246374070644 0 0 0 0 -0.0039911740459502 0 0.0067129032686353 -0.016593548469245 0.027076344937086 0.018253248184919 0.024089247803204 0.1892526904121 + 1 0.65405404283813 0.13627457420376 -0.28159200772977 0.10760726034641 0 -0.015136853791773 0 0 0 0 -0.0063730031251907 0 0 0.017592553049326 0 0.053776569664478 0 0 0 0 0.0062129032448865 -0.032093548215926 0.020576342940331 -0.028046753257513 0.0091892479686067 0.028452690690756 + 1 0.66486485364894 0.15766244856461 -0.26254634409682 0.041445430368185 0 -0.01398154720664 0.0027592312544584 0 0 0 -0.0029166976455599 0 0 -0.0056622386910021 0 0.17381598055363 0 0 0 0 -0.001187096349895 -0.050693546421826 0.021176343783736 0.041453246027231 0.020289248670451 -0.12694731261581 + 1 0.67567566445975 0.17940094381662 -0.24233510290676 0.0041748615913093 0 -0.0089788129553199 0.11372494697571 0 0 0 0 0 0 -0.012351076118648 0 0.12343798577785 0 0 0 0 0.017612903378904 0.042106452398002 0.018076343461871 -0.12294675037265 0.017289248178713 0.13255269173533 + 1 0.68648647527056 0.20149005995979 -0.22093933167899 -0.010208387859166 0 -0.0045533217489719 0.14893823862076 0 0 0 0 0 0 -0.010752606205642 0 0.043845307081938 0 0 0 0 0.041512903757393 0.049206453375518 0.027976345270872 -0.12854675576091 0.038189248065464 0.040852691046894 + 1 0.69729728608137 0.22392979699412 -0.19834007793292 -0.012246385216713 0 -0.0019292180659249 0.074762977659702 0 0 0 0 0 0.020822903141379 -0.0066744363866746 0 0.0017421913798898 0 0 0 0 0.027312903665006 -0.001593547873199 0.015076342970133 -0.037746753543615 0.0091892479686067 -0.22444730903953 + 1 0.70810809689218 0.24672015491961 -0.17451838918792 -0.0089307744055986 0 0 0.018157737329602 0 0 0 0 0 0.13064929842949 -0.0033013850916177 0 -0.013717637397349 0 0 0 0 0.039112904109061 0.054306454025209 0.013676343485713 -0.081246752291918 0.0090892481384799 -0.077847308479249 + 1 0.71891890770299 0.26986113373627 -0.14945531296342 -0.0049531273543835 0.054176468402147 0 -0.0069770426489413 0 0 0 0 0 0.11330310255289 -0.0013714701635763 0 -0.015004185028374 0 0 0 0 0.048112903721631 0.041506451554596 0.025376342236996 -0.12344675138593 0.0063892480684444 0.25445269141346 + 1 0.7297297185138 0.29335273344409 -0.12313189677879 -0.0022502727806568 0.15725728869438 0 -0.013952994719148 0 0 0 0 0 0.045990746468306 0 0 -0.010505232028663 0 0 0 0 0.07791290152818 -0.0022935476154089 0.018676344305277 -0.024246752262115 0.04248924634885 0.085852690972388 + 1 0.74054052932461 0.31719495404306 -0.095529188153436 0 0.10772325843573 0 -0.011925142258406 0 0 0 0 0 0.0062225582078099 0 0 -0.005665572360158 0.072235301136971 0 0 0 0.067712903954089 -0.037293546833098 0.020676344633102 0.018553245812654 0.011789248208515 -0.20184731390327 + 1 0.75135134013542 0.3413877955332 -0.066628234606755 0 0.037206649780273 0 -0.0073214070871472 0 0 0 0 0 -0.0095938388258219 0 0 -0.0025188846047968 0.209676399827 0 0 0 0.099112902767956 0.036506452597678 0.025876343250275 -0.070646753534675 0.028789247269742 -0.1198473116383 + 1 0.76216215094623 0.3659312579145 -0.036410083658144 0 0.00060790922725573 0 0.028887817636132 0 0 0 0 0 -0.012364141643047 0 0 0 0.1436310261488 0 0 0 0.088712905533612 0.01690645236522 0.023276343941689 -0.088646754622459 0.010689248214476 0.071252689696848 + 1 0.77297296175705 0.39082534118696 -0.0048557828269987 0 -0.012588676065207 0 0.15184837579727 0 0 0 0 0 -0.0092787202447653 0 2.1845621631655e-06 0 0.049608871340752 0 0 0 0.085712906904519 -0.034393546171486 0.020676344633102 -0.018446754664183 0.009689248050563 -0.024347308091819 + 1 0.78378377256786 0.41607004535059 0.028053620367284 0 -0.013394667766988 0 0.1210593432188 0 0 0 0 0 -0.0052461246959865 0 0.07354100048542 0 0.00081054569454864 0 0 0 0.13121290225536 0.022306452505291 0.01967634446919 -0.16344675049186 0.0023892478784546 0.16675269696862 + 1 0.79459458337867 0.44166537040537 0.062337078405308 0 -0.0092568807303905 0 0.046627011150122 0 0 0 0 0 -0.002418847521767 0 0.17544116079807 0 -0.016784902662039 0 0 0 0.15361290145665 0.026106451638043 0.037276342511177 -0.11474675312638 0.014089248026721 0.012452690396458 + 1 0.80540539418948 0.46761131635132 0.098013543767675 0.02917392924428 -0.004947098903358 0 0.0046971309930086 0 0 0 0 0 0 0 0.11217899620533 0 -0.017859559506178 0 0 0 -0.02118709590286 -0.047993549145758 0.013076344504952 0.07745324447751 0.0021892479853705 -0.17064730729908 + 1 0.81621620500029 0.49390788318842 0.13510196893499 0.11957256495953 -0.0021839591208845 0 -0.011484319344163 0 0 0 0 0 0 0 0.036549493670464 0 -0.012342507950962 0 0 0 -0.0039870971813798 0.018306451849639 0.019076343625784 -0.05524675315246 0.010389247792773 -0.03394731041044 + 1 0.8270270158111 0.52055507091669 0.17362130638786 0.091601468622684 0 0 -0.013777210377157 0 0 0 0 0 0 0 -0.0013280296698213 0 -0.0065961321815848 0 0 0 0.0037129032425582 0.036206453107297 0.028176344931126 -0.061146752908826 0.025189247797243 0.092052691616118 + 1 0.83783782662191 0.54755287953612 0.21359050860688 0.034355282783508 0 0 -0.010047196410596 0 0 0 0 0 0 0 -0.01445743534714 0 -0.0029119455721229 0.020822903141379 0 0 -0.0069870967417955 -0.029893548227847 0.016676343977451 0.052853245288134 0.021489248494618 -0.052347308956087 + 1 0.84864863743272 0.57490130904672 0.25502852807265 0.002809077501297 0 2.1826426745974e-06 -0.0055723269470036 0 0 0 0 0 0 0 -0.014613589271903 0 0 0.13064929842949 0 0 -0.016887097619474 -0.011393547989428 0.014476343989372 0.037353243678808 0.001989247975871 -0.094247310422361 + 1 0.85945944824353 0.60260035944847 0.29795431726579 -0.009173322468996 0 0.073538526892662 -0.002531590173021 0 0 0 0 0 0 0 -0.0098465224727988 0 0 0.11330310255289 0 0 -0.0071870964020491 0.041306451894343 0.024676345288754 -0.050646753166802 -0.012310751830228 0.016052690334618 + 1 0.87027025905434 0.63065003074138 0.34238682866689 -0.010652085766196 0 0.17544116079807 0 0 0 0 0 0 0 0.0040210401639342 -0.0051689259707928 0 0 0.045990746468306 0 0 -0.0098870964720845 0.0033064521849155 0.026976343244314 0.055753249675035 -0.014910753001459 -0.020947310142219 + 1 0.88108106986515 0.65905032292546 0.38834501475656 -0.0076612252742052 0 0.11218037456274 0 0 0 0 0 0 0 0.11895248293877 -0.0022502795327455 0 0 0.0062225582078099 0 0 0.0030129032675177 0.061606450937688 0.023776344954967 -0.057646753266454 -0.0056107520358637 0.17195269558579 + 1 0.89189188067596 0.6878012360007 0.4358478280154 0.015245664864779 0 0.036550357937813 0 0 0 0 0 0 0 0.14677180349827 0 0 0 -0.0095938388258219 0 0 0.014212903100997 0.0087064522085711 0.037576343864202 -0.044646752998233 -0.0071107522817329 0.09555269125849 + 1 0.90270269148678 0.71690276996709 0.48491422092401 0.14210297167301 0 -0.0013276820536703 0 0 0 0 0 0 0 0.071675792336464 0 0 0 -0.012364141643047 0 0 0.029112902469933 -0.037493546493351 0.033676344901323 -0.028546752408147 -0.00081075204070657 0.06235269177705 + 1 0.91351350229759 0.74635492482465 0.535563145963 0.13056182861328 0 -0.014457356184721 0 0 0 0 0 0 0 0.016579894348979 0 0.00069556123344228 0 -0.0092787202447653 0 0 0.017512903548777 -0.012193548493087 0.027576342225075 -0.073646754026413 -0.0079107518540695 0.090652690269053 + 1 0.9243243131084 0.77615770057338 0.58781355561298 0.054395545274019 0 -0.014613640494645 0 0 0 0 0 0 0 -0.0075534516945481 0 0.10747737437487 0 -0.0052461246959865 0 0 -0.028887095861137 -0.040393547154963 0.02277634292841 0.032053243368864 -0.030210751225241 -0.11324730422348 + 1 0.93513512391921 0.80631109721326 0.64168440235453 0.0082204462960362 0 -0.0098466016352177 0 0 0 0 0 0 0 -0.013995666056871 0 0.17133408784866 0 -0.002418847521767 0 0 0.0011129034683108 -0.024293546564877 0.026476342231035 -0.008346751332283 0.0063892480684444 -0.13364730682224 + 1 0.94594593473002 0.8368151147443 0.69719463866827 -0.01041049323976 0 -0.0051689869724214 0.042828563600779 0 0 0 0 0 0 -0.011749600991607 0 0.093689449131489 0 0 0 0 -0.030687096528709 0.0040064523927867 0.022076342254877 -0.0096467547118664 -0.012210752000101 -0.096747308038175 + 1 0.95675674554083 0.86766975316651 0.75436321703481 -0.013959442265332 0 -0.0022503104992211 0.15526303648949 0 0 0 0 0 0 -0.0071360059082508 0 0.025812968611717 0 0 0 0 -0.034287097863853 -0.044993546791375 0.019276343286037 0.092153239995241 -0.0098107523517683 -0.099347307346761 + 1 0.96756755635164 0.89887501247988 0.81320908993473 -0.01063232216984 0 0 0.11444798856974 0 0 0 0 0 0 -0.0034730304032564 0.037509337067604 -0.0056235245428979 0 0 0 0 -0.016187096945941 0.00020645186305046 0.022976342588663 0.016353245824575 -0.015210752491839 0.12425269279629 + 1 0.97837836716245 0.93043089268441 0.87375120984866 -0.006070701405406 0 0 0.041782386600971 0 0 0 0 0 0 0 0.15373615920544 -0.015256246551871 0 0 0 0 -0.013587097637355 -0.029593546874821 0.029876343905926 0.02615324780345 0.0034892478724942 0.088752687908709 + 1 0.98918917797326 0.9623373937801 0.93600852925718 -0.0028200859669596 0 0 0.0025689851026982 0 0.028872592374682 0 0 0 0 0 0.11777331680059 -0.013806855306029 0 0 0 0 -0.0050870971754193 -0.018593546934426 0.036676343530416 -0.0050467513501644 0.0057892481563613 0.12315268907696 + 1 0.99999998878407 0.99459451576695 1.0000000006409 0 0 0 -0.01208124961704 0 0.1349770128727 0 0 0 0 0 0.044171079993248 -0.0087651275098324 0 0 0 0 0.0079129033256322 -0.18649354297668 0.025376342236996 0.10375324264169 0.0030892478534952 -0.1448473026976 +# + diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index dc71daf06..605764a6d 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -42,3 +42,23 @@ def test_fast_inv(): with pytest.raises(np.linalg.linalg.LinAlgError) as excinfo: fast_inv(a) assert "Last 2 dimensions of the array must be square" in str(excinfo.value) + + +def test_cov2corr(): + from brainiak.utils.utils import cov2corr + import numpy as np + cov = np.array([[4,3,0],[3,9,0],[0,0,1]]) + corr = cov2corr(cov) + assert np.isclose(corr, np.array([[1,0.5,0],[0.5,1,0],[0,0,1]])).all(),\ + "Converting from covariance matrix to correlation incorrect" + + +def test_ReadDesign(): + from brainiak.utils.utils import ReadDesign + import numpy as np + import os.path + file_path = os.path.join(os.path.dirname(__file__), "example_design.1D") + design = ReadDesign(fname=file_path) + assert design, 'Failed to read design matrix' + read = ReadDesign() + assert read, 'Failed to initialize an instance of the class' \ No newline at end of file