├── .gitignore ├── BDeuScore.py ├── FGES-py_Jupyter_Tutorial.ipynb ├── SEMScore.py ├── SemEstimator.py ├── __init__.py ├── data ├── 40_random.txt ├── 50_edges.txt ├── 50_fully_connected.txt ├── HCP.tsv ├── collider_1.txt ├── collider_2.txt ├── collider_3.txt ├── collider_4.txt ├── collider_5.txt ├── data1.txt ├── linear_1.txt ├── params_1.txt ├── params_1_graph.txt ├── single_edge_1.txt ├── single_edge_2.txt └── single_edge_3.txt ├── fges.py ├── graph_util.py ├── knowledge.py ├── meekrules.py ├── runner.py ├── search_util.py └── tests ├── __init__.py ├── fges_tests.py ├── test_graph_util.py ├── test_meek_rules.py ├── test_search_util.py └── test_util.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | .vscode 3 | .Python 4 | *.json 5 | include/ 6 | share/ 7 | lib/ 8 | bin/ 9 | .idea 10 | *.pkl 11 | *.pyc 12 | *.npy 13 | *.ipynb 14 | .DS_store 15 | */.DS_store 16 | -------------------------------------------------------------------------------- /BDeuScore.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from numpy.linalg import inv 3 | import math 4 | from scipy import special 5 | 6 | 7 | class BDeuScore: 8 | def __init__(self, dataset, variables, sample_prior=1, 9 | structure_prior=1): 10 | """Initialize the BDeuScore object. 11 | 12 | :param dataset: 2D np.array, with a row for each data 13 | point and a column for each variable. 14 | :param variables: np.array containing the variable ids 15 | :param sample_prior: sample prior 16 | :param structure_prior: structure prior 17 | """ 18 | 19 | assert len(dataset.shape) == 2, "Dataset must be 2-dimensional." 20 | # defining attributes 21 | self.dataset = dataset 22 | self.variables = variables 23 | self.sampleSize = dataset.shape[0] 24 | 25 | # note that the sample prior is set by the 26 | # sparsity parameter in runner.py 27 | self.sample_prior = sample_prior 28 | self.structure_prior = structure_prior 29 | 30 | # num_categories is always 2 for binary data 31 | # (TODO: if data is not binary we must create 32 | # a method which computes the number 33 | # of categories for each variable) 34 | self.num_categories = np.full(len(self.variables), 2) 35 | 36 | def local_score(self, node, parents): 37 | """ 38 | Method to compute the score associated to having 39 | a certain set of parents associated to a node. 40 | 41 | :param node: int representing the node in question. 42 | :param parents: np.array of ints representing the parent nodes. 43 | """ 44 | # number of categories of this node 45 | c = self.num_categories[node] 46 | 47 | # number of categories of the parent nodes 48 | dims = self.num_categories[parents] 49 | 50 | # number of parent states (i.e. multiplying the number of 51 | # categories of each variable together) 52 | r = np.prod(dims) 53 | 54 | # conditional cell coeffs for node given parents (node) 55 | n_jk = np.zeros((r, c)) 56 | n_j = np.zeros(r) 57 | my_parents = self.dataset[:, parents] 58 | my_child = self.dataset[:, node] 59 | 60 | # populate the conditional cell coeffs 61 | for i in range(self.sampleSize): 62 | parent_values = my_parents[i] 63 | child_value = my_child[i] 64 | row_index = self.get_row_index(dims, parent_values) 65 | 66 | n_jk[row_index][child_value] += 1 67 | n_j[row_index] += 1 68 | 69 | # finally compute the score 70 | score = self.get_prior_for_structure(len(parents)) 71 | 72 | cell_prior = self.sample_prior / (c*r) 73 | row_prior = self.sample_prior / r 74 | 75 | for j in range(r): 76 | score -= special.loggamma(row_prior + n_j[j]) 77 | for k in range(c): 78 | score += special.loggamma(cell_prior + n_jk[j][k]) 79 | 80 | score += r * special.loggamma(row_prior) 81 | score -= c * r * special.loggamma(cell_prior) 82 | 83 | return score 84 | 85 | def get_prior_for_structure(self, num_parents): 86 | """ 87 | Method that returns the initial score value 88 | as defined by the structure prior. 89 | 90 | :param num_parents: int representing the number of 91 | nodes in the parents np.array. 92 | """ 93 | e = self.structure_prior 94 | vm = self.dataset.shape[0] - 1 95 | return num_parents*np.log(e/vm) + (vm - num_parents) * np.log(1-(e/vm)) 96 | 97 | def get_row_index(self, dims, values): 98 | """ 99 | Method that returns the index to increment in 100 | the cell coeffs. 101 | 102 | :param dims: np.array containing the number of categories 103 | adopted by each node in the parents np.array. 104 | :param values: value of parent nodes at a specific time instant. 105 | """ 106 | row_index = 0 107 | for i in range(len(dims)): 108 | row_index *= dims[i] 109 | row_index += values[i] 110 | return row_index 111 | 112 | def local_score_diff_parents(self, node1, node2, parents): 113 | """ 114 | Method to compute the change in score resulting 115 | from adding node1 to the list of parents. 116 | 117 | :param node1: int representing the node to add 118 | to list of parents. 119 | :param node2: int representing the node in question. 120 | :param parents: list of ints representing the parent nodes. 121 | """ 122 | return self.local_score(node2, parents + [node1]) - self.local_score(node2, parents) 123 | 124 | def local_score_diff(self, node1, node2): 125 | """ 126 | Method to compute the change in score resulting 127 | from having node1 as a parent. 128 | 129 | :param node1: int representing the parent node. 130 | :param node2: int representing the node in question. 131 | """ 132 | return self.local_score_diff_parents(node1, node2, []) 133 | -------------------------------------------------------------------------------- /FGES-py_Jupyter_Tutorial.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "This tutorial is intended to show proper usage of the `fges-py` library. " 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "`fges-py` is a full python implementation of the Fast Greedy Equivalence Search algorithm, which is described [here](https://www.ncbi.nlm.nih.gov/pubmed/28393106)." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "First we will install the necessary dependencies:" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": null, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "!pip3 install numpy\n", 31 | "!pip3 install scipy\n", 32 | "!pip3 install sortedcontainers\n", 33 | "!pip3 install dill\n", 34 | "!pip3 install argparse\n", 35 | "!pip3 install networkx" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "The entry point of the algorithm is in the `runner.py` file. The algorithm takes three arguments as input: \n", 43 | "* a dataset which is formatted as a text file with a row for each datapoint and a column for each variable, \n", 44 | "* a save name\n", 45 | "* a sparsity level, which acts as a limit on output graph complexity (set to 1 below)" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "For example, the code may be run with the following command (this will take about 1min for sparsity 4 on the HCP.tsv data). Make sure to adjust the path appropriately:" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": null, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "!python3.6 ~//fges-py/runner.py ~//fges-py/data/HCP.tsv demo_save_name 4" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "This data will be stored under `demo_save_name` in the folder where this notebook is running. To load the graph, we can load this file using `pickle`:" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": null, 74 | "metadata": { 75 | "collapsed": true 76 | }, 77 | "outputs": [], 78 | "source": [ 79 | "import numpy as np\n", 80 | "import pickle\n", 81 | "with open('demo_save_name.pkl', 'rb') as f:\n", 82 | " result = pickle.load(f)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "We can view a list of the edges in the loaded graph like so:" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": null, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "result['graph'].edges()" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": { 105 | "collapsed": true 106 | }, 107 | "outputs": [], 108 | "source": [] 109 | } 110 | ], 111 | "metadata": { 112 | "kernelspec": { 113 | "display_name": "Python 3", 114 | "language": "python", 115 | "name": "python3" 116 | }, 117 | "language_info": { 118 | "codemirror_mode": { 119 | "name": "ipython", 120 | "version": 3 121 | }, 122 | "file_extension": ".py", 123 | "mimetype": "text/x-python", 124 | "name": "python", 125 | "nbconvert_exporter": "python", 126 | "pygments_lexer": "ipython3", 127 | "version": "3.6.1" 128 | } 129 | }, 130 | "nbformat": 4, 131 | "nbformat_minor": 2 132 | } 133 | -------------------------------------------------------------------------------- /SEMScore.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from numpy.linalg import inv 3 | import math 4 | 5 | 6 | class SEMBicScore: 7 | 8 | def __init__(self, penalty_discount, 9 | dataset=None, 10 | corrs=None, dataset_size=None, 11 | cache_interval=1): 12 | """Initialize the SEMBicScore object. 13 | 14 | Must specify either the dataset or the correlation matrix and dataset size. 15 | 16 | :param penalty_discount: Sparsity parameter 17 | :param dataset: 2D np.array, with a row for each data point and a column for each variable 18 | :param corrs: 2D square np.array, the correlation coefficients 19 | :param dataset_size: the number of data points 20 | :param cache_interval: parameter to limit how many partial correlations are cached 21 | """ 22 | self.penalty = penalty_discount 23 | self.cache = {} 24 | self.cache_interval = cache_interval 25 | 26 | if dataset is not None: 27 | assert corrs is None and dataset_size is None, \ 28 | "SEMBicScore: must specify either dataset or {corrs, dataset_size}" 29 | assert len(dataset.shape) == 2 30 | self.corrcoef = np.corrcoef(dataset.transpose()) 31 | self.sample_size = dataset.shape[0] 32 | 33 | elif corrs is not None and dataset_size is not None: 34 | assert len(corrs.shape) == 2 35 | assert corrs.shape[0] == corrs.shape[1] 36 | self.corrcoef = corrs 37 | self.sample_size = dataset_size 38 | 39 | else: 40 | raise AssertionError("SEMBicScore: must specify either dataset or {corrs, dataset_size}") 41 | 42 | # def partial_corr(self, x, y, Z): 43 | # """ 44 | # Returns the partial correlation coefficients between elements of X controlling for the elements in Z. 45 | # """ 46 | # x_data = self.dataset[:,x] 47 | # y_data = self.dataset[:,y] 48 | # if Z == []: 49 | # return self.corrcoef[x, y] 50 | # Z_data = self.dataset[:,Z] 51 | # 52 | # beta_i = np.linalg.lstsq(Z_data, x_data)[0] 53 | # beta_j = np.linalg.lstsq(Z_data, y_data)[0] 54 | # 55 | # res_j = x_data - Z_data.dot(beta_i) 56 | # res_i = y_data - Z_data.dot(beta_j) 57 | # 58 | # return np.corrcoef(res_i, res_j)[0, 1] 59 | 60 | def recursive_partial_corr(self, x, y, Z): 61 | if len(Z) == 0: 62 | return self.corrcoef[x, y] 63 | else: 64 | z0 = min(Z) 65 | Z1 = Z - {z0} 66 | key1 = (frozenset({x, y}), Z1) 67 | if key1 not in self.cache: 68 | term1 = self.recursive_partial_corr(x, y, Z1) 69 | if len(Z1) > 0 and len(Z1) % self.cache_interval == 0: 70 | self.cache[key1] = term1 71 | else: 72 | term1 = self.cache[key1] 73 | 74 | key2 = (frozenset({x, z0}), Z1) 75 | if key2 not in self.cache: 76 | term2 = self.recursive_partial_corr(x, z0, Z1) 77 | if len(Z1) > 0 and len(Z1) % self.cache_interval == 0: 78 | self.cache[key2] = term2 79 | else: 80 | term2 = self.cache[key2] 81 | 82 | key3 = (frozenset({y, z0}), Z1) 83 | if key3 not in self.cache: 84 | term3 = self.recursive_partial_corr(y, z0, Z1) 85 | if len(Z1) > 0 and len(Z1) % self.cache_interval == 0: 86 | self.cache[key3] = term3 87 | else: 88 | term3 = self.cache[key3] 89 | 90 | return (term1 - (term2 * term3)) / math.sqrt((1 - (term2 * term2)) * (1 - (term3 * term3))) 91 | 92 | # def local_score(self, node, parents): 93 | # """ `node` is an int index """ 94 | # #print("Node:", node, "Parents:", parents) 95 | # variance = self.cov[node][node] 96 | # p = len(parents) 97 | # 98 | # # np.ix_(rowIndices, colIndices) 99 | # 100 | # covxx = self.cov[np.ix_(parents, parents)] 101 | # covxx_inv = inv(covxx) 102 | # 103 | # if (p == 0): 104 | # covxy = [] 105 | # else: 106 | # # vector 107 | # covxy = self.cov[np.ix_(parents, [node])] 108 | # 109 | # b = np.dot(covxx_inv, covxy) 110 | # 111 | # variance -= np.dot(np.transpose(covxy), b) 112 | # 113 | # if variance <= 0: 114 | # return None 115 | # 116 | # returnval = self.score(variance, p) 117 | # return returnval 118 | 119 | # def local_score_no_parents(self, node): 120 | # """ if node has no parents """ 121 | # variance = self.cov[node][node] 122 | # 123 | # if variance <= 0: 124 | # return None 125 | # 126 | # return self.score(variance) 127 | 128 | # def score(self, variance, parents_len=0): 129 | # bic = - self.sample_size * math.log(variance) - parents_len * self.penalty * math.log(self.sample_size) 130 | # # TODO: Struct prior? 131 | # return bic 132 | 133 | def local_score_diff_parents(self, node1, node2, parents): 134 | parents = frozenset(parents) 135 | r = self.recursive_partial_corr(node1, node2, parents) 136 | return -self.sample_size * math.log(1.0 - r * r) - self.penalty * math.log(self.sample_size) 137 | #return self.local_score(node2, parents + [node1]) - self.local_score(node2, parents) 138 | 139 | def local_score_diff(self, node1, node2): 140 | return self.local_score_diff_parents(node1, node2, []) 141 | -------------------------------------------------------------------------------- /SemEstimator.py: -------------------------------------------------------------------------------- 1 | 2 | from fges import FGES 3 | from SEMScore import SEMBicScore 4 | from search_util import * 5 | import numpy as np 6 | 7 | class SemEstimator: 8 | 9 | def __init__(self, dataset, sparsity=2, savename=None): 10 | ''' Initialize a SEM Estimator ''' 11 | self.dataset = dataset 12 | self.sparsity = sparsity 13 | self.savename = savename 14 | 15 | self.pattern = None 16 | self.dag = None 17 | self.penalty = None 18 | self.params = None 19 | self.residuals = None 20 | self.graph_cov = None 21 | self.true_cov = np.cov(dataset.transpose()) 22 | 23 | def set_pattern(self, pattern): 24 | self.pattern = pattern 25 | self.dag = None 26 | 27 | def search(self, verbose=False, cache_interval=1): 28 | ''' Run an FGES search ''' 29 | score = SEMBicScore(self.sparsity, dataset=self.dataset, cache_interval=cache_interval) 30 | self._fges = FGES(list(range(self.dataset.shape[1])), score, save_name=self.savename, verbose=verbose) 31 | self._fges.search() 32 | self.set_pattern(self._fges.graph) 33 | 34 | def get_dag(self): 35 | if self.dag is None: 36 | if self.pattern is None: 37 | self.search() 38 | self.dag, self.penalty = dagFromPatternWithColliders(self.pattern) 39 | return self.dag 40 | 41 | def estimate(self): 42 | ''' Estimate edge weights ''' 43 | self.get_dag() 44 | 45 | self.params, self.residuals = estimate_parameters(self.dag, self.dataset) 46 | self.graph_cov = get_covariance_matrix(self.params, self.residuals) 47 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eberharf/fges-py/961188a48b8689ae451861a7232262adffb46d45/__init__.py -------------------------------------------------------------------------------- /data/collider_1.txt: -------------------------------------------------------------------------------- 1 | X1 X2 X3 2 | 1.7869 0.7324 -1.3530 3 | 0.2002 -0.2018 0.9317 4 | 1.7231 -2.9502 -1.7968 5 | -1.4848 -2.7838 6.9764 6 | 0.4706 -1.9414 1.7225 7 | 1.1321 1.0168 -4.0000 8 | 1.0335 1.7365 -0.3499 9 | 1.3195 -0.2100 -1.0427 10 | 0.8520 -1.9769 -1.0067 11 | 0.0231 0.7298 -1.7389 12 | 0.7401 -0.8008 3.3581 13 | -2.0537 1.6676 4.0060 14 | -0.9154 -1.2341 2.2162 15 | -1.6451 -0.4509 2.0177 16 | 0.3636 0.0461 -1.6078 17 | 0.2437 -2.5463 0.7920 18 | -0.1690 -3.1754 3.0947 19 | 1.5954 0.0517 -4.0841 20 | 0.0703 2.4978 -1.1081 21 | 0.2150 1.8194 -2.1761 22 | 1.1456 -1.0914 -1.4977 23 | -0.2050 -0.4743 0.1768 24 | -0.3693 -1.8408 2.7590 25 | -1.6631 -1.6655 3.3695 26 | 0.5112 0.0581 -2.9762 27 | -1.0575 2.7114 0.1417 28 | -0.3196 4.1104 -3.1743 29 | 1.5595 0.2065 -3.5248 30 | 0.5565 1.5530 -1.5917 31 | -0.1730 1.6696 1.8385 32 | -0.9016 -4.3590 0.8092 33 | -0.0597 1.9776 -3.0717 34 | -2.3203 0.7434 1.3621 35 | -2.0180 -0.6351 0.3855 36 | 0.3707 -0.0434 -1.2272 37 | 0.1867 1.4426 0.7999 38 | 1.9659 -1.1257 -0.8178 39 | 0.6937 0.2871 -0.4287 40 | 0.1094 -1.9184 -1.7470 41 | -0.6720 0.8403 -0.4589 42 | -2.0260 0.9793 0.2502 43 | 0.0112 0.8090 0.3828 44 | -0.5451 -0.9364 0.2744 45 | -0.2377 -1.1349 -0.0804 46 | 0.1039 0.7324 -1.1734 47 | 2.1091 -0.3180 -2.7315 48 | 0.9179 0.6004 -3.7155 49 | -1.2495 0.4416 -1.4304 50 | 1.2848 -1.9496 -0.4651 51 | 0.8130 -1.0275 1.2244 52 | 0.5241 1.0444 -5.1213 53 | 0.7677 -2.0094 1.2068 54 | -0.6001 1.4905 0.8852 55 | 0.0494 -0.8477 -0.9638 56 | -0.5612 4.1986 0.9903 57 | 0.4128 -0.9873 0.2324 58 | -0.4003 -1.9122 1.9089 59 | 0.1913 1.7060 -0.6234 60 | -0.8396 0.3556 2.8150 61 | -0.8113 -0.7999 3.7927 62 | 0.2494 -1.7425 1.7554 63 | -0.7097 -1.4981 2.6692 64 | 1.7416 0.3273 -0.3035 65 | 0.0171 -0.0577 0.5227 66 | -0.3970 1.0340 1.6731 67 | 0.7704 0.3947 -0.9166 68 | 0.0089 -1.8546 -0.6948 69 | -0.6254 -2.1146 3.0955 70 | 0.0562 1.2452 1.2660 71 | -0.6090 -4.0589 2.0583 72 | -0.2539 -1.1119 0.8132 73 | -0.8492 -0.2565 1.1412 74 | -2.4110 -2.0078 5.0902 75 | 1.2268 3.0729 -4.1854 76 | 0.4469 -1.5657 0.2821 77 | 0.8737 1.4921 -2.9592 78 | -0.5416 2.2367 0.7982 79 | 0.3844 0.6844 0.2547 80 | -0.4471 1.0137 -0.0131 81 | 1.2902 -0.8576 -1.2759 82 | -0.8763 0.3283 0.3094 83 | 0.6502 1.7117 -1.8099 84 | -1.1329 2.3970 -1.0835 85 | -1.4376 0.0565 3.2165 86 | -0.0448 -1.8356 0.5852 87 | 0.8885 1.7652 -1.2521 88 | 1.2195 0.5618 -3.8167 89 | -1.1410 -2.0937 2.5047 90 | -0.7690 0.3086 -0.1310 91 | 0.9377 0.7832 -5.6508 92 | 0.3557 2.0159 -1.6169 93 | 1.3387 -2.8972 3.8145 94 | -0.2658 -1.3369 -0.5513 95 | 1.4862 0.4709 -3.2630 96 | -0.1584 0.8209 -0.8450 97 | 1.8754 -1.3959 -1.5557 98 | -1.1411 -1.6410 2.6862 99 | 0.4618 -2.9149 0.4402 100 | -0.1771 2.0952 -1.1855 101 | -0.6951 2.3902 -2.8638 102 | 0.4207 -0.5683 0.8444 103 | -1.0481 -1.5666 3.1244 104 | -0.6390 0.9374 -2.6336 105 | -0.1162 -1.8180 1.0340 106 | 0.4252 1.7579 -5.3201 107 | -0.0659 1.4474 -1.5221 108 | 1.5783 -0.6044 -1.8706 109 | 0.4085 -2.2673 1.5970 110 | -1.0080 -1.6561 4.6537 111 | -1.5243 0.4395 3.3762 112 | -1.0513 0.9479 1.1395 113 | 1.2884 0.4872 -5.0845 114 | -1.7691 -2.7462 7.0158 115 | -0.1646 0.1660 -1.8695 116 | -0.5608 1.5979 -0.9791 117 | 0.0833 1.3112 2.3391 118 | 0.9282 2.9746 -2.7005 119 | -0.8619 -1.8532 2.0282 120 | 0.2194 -0.6242 1.9738 121 | -0.7177 -0.2136 4.1886 122 | 0.9801 -0.2637 -2.7088 123 | 0.5917 -3.7915 -0.2654 124 | -0.8467 1.9818 0.0430 125 | -0.1049 -0.3922 1.1507 126 | -0.3125 1.0905 -0.4396 127 | 0.4858 -2.4832 1.6491 128 | 1.3427 2.9294 -3.6810 129 | -0.4561 2.4764 -0.4867 130 | 0.1062 0.6147 0.2877 131 | 0.3248 -1.2016 -3.0802 132 | -1.3053 -0.4456 2.6331 133 | -0.2907 -2.6172 4.0340 134 | 1.5716 0.8792 -4.3413 135 | 0.9572 1.7511 -3.3209 136 | -0.7328 0.1276 -1.2009 137 | 0.1071 0.6390 -0.6346 138 | 0.8121 1.4646 0.8150 139 | -1.2583 -2.2225 4.2728 140 | -1.0548 -0.4006 0.0034 141 | 0.5080 -1.7327 -0.6728 142 | -0.9592 2.9405 0.2514 143 | -1.0381 1.6122 0.1085 144 | 0.3157 -2.5547 2.5072 145 | 1.2096 -2.4331 1.3065 146 | 0.0464 1.8003 -4.7052 147 | -0.3487 -0.9287 -0.0025 148 | 0.1806 0.2905 -0.7372 149 | 0.1073 0.1160 -0.4185 150 | -1.8923 0.8333 3.8903 151 | -0.1192 1.6664 -0.7852 152 | -1.5308 1.4819 5.2034 153 | 0.5341 -2.3791 -0.6181 154 | 0.7881 0.0017 -1.9870 155 | -0.6032 1.3141 -1.8618 156 | -2.0672 1.3850 0.8187 157 | 0.1798 -0.2190 -3.2475 158 | -1.3655 0.0234 5.6586 159 | 1.0018 -0.2115 0.9231 160 | 1.7195 -1.4766 -1.5319 161 | 1.2638 -3.1002 1.2036 162 | 0.9321 1.1860 -2.6442 163 | 1.2227 -2.3994 0.5310 164 | -0.2515 -5.3342 1.9025 165 | 1.0665 -0.7613 -0.1345 166 | -0.0583 -1.5093 0.4274 167 | 0.8051 -0.4880 0.7087 168 | 0.0231 -1.4349 2.4960 169 | -0.9150 -1.9873 1.7107 170 | -0.4536 0.8591 -0.2222 171 | 0.1395 0.4868 1.1484 172 | -1.2535 -1.0900 0.5993 173 | 0.0594 -0.6554 -0.2438 174 | -1.5875 2.7220 -0.1970 175 | 0.2899 -0.1024 -1.8767 176 | -0.4134 1.4748 0.2624 177 | -0.7932 -0.8163 5.0096 178 | -0.4748 1.2958 -0.2950 179 | 0.8918 1.1687 -2.7910 180 | 1.1756 0.6599 -0.4933 181 | -1.5564 -0.4579 -0.9636 182 | -0.0554 1.5534 2.1558 183 | 0.5922 2.4285 -0.4728 184 | 1.5552 -0.6070 -2.5137 185 | 0.4447 -3.4539 -1.9230 186 | 0.2578 2.9765 -0.6720 187 | -1.1542 1.1036 2.9265 188 | 1.6134 -0.2445 -1.5788 189 | -0.4735 -1.8173 4.8565 190 | -0.6493 -0.8774 1.6265 191 | 1.1198 -2.2061 1.3041 192 | 0.4390 -0.6128 0.4360 193 | 0.6428 0.1244 -1.8335 194 | -0.2877 -0.6256 -0.5758 195 | -0.0332 -0.7172 1.9901 196 | 1.4647 -0.1540 -1.7222 197 | -1.5485 0.1268 1.2300 198 | 0.1722 -0.8336 -0.4094 199 | 0.3725 1.0658 -0.5911 200 | -0.5635 1.6244 -0.0049 201 | 0.8429 -2.3537 1.3145 202 | -0.6351 4.8859 -2.9705 203 | -0.1606 -0.4731 -1.8537 204 | -1.1716 0.8000 2.3647 205 | 1.0954 -2.0969 0.6080 206 | -0.7566 2.7822 0.2100 207 | 1.6547 -1.5476 -4.1702 208 | 0.2338 -1.3415 3.4062 209 | 0.2400 0.5223 0.8405 210 | 0.4120 2.4207 -0.3113 211 | -0.9919 -0.0903 2.2016 212 | 0.6102 1.6538 -1.2869 213 | -0.4561 0.5274 -1.0341 214 | -2.6669 -1.7821 5.1306 215 | -1.8143 -1.0073 2.6571 216 | 0.9375 0.1752 -0.9418 217 | -0.6463 1.6371 -0.3831 218 | 1.0973 1.7363 -2.0831 219 | -1.9110 -0.0486 4.2968 220 | 1.1857 -0.9300 -4.1763 221 | 1.4180 1.7297 -1.4599 222 | -1.1575 1.6216 -0.8415 223 | 1.4692 -0.2405 -3.8994 224 | 1.6632 0.8512 -4.2538 225 | -0.4709 0.4166 0.1549 226 | 0.4590 1.2725 -1.9841 227 | 1.7829 -0.3209 -0.0152 228 | -3.1483 -2.7843 4.7948 229 | 0.3914 -2.7283 -0.6944 230 | -1.6485 -0.5400 4.9442 231 | 1.1054 1.0559 -1.5166 232 | 0.7875 -1.6138 0.8181 233 | 1.2075 0.5971 -3.3946 234 | 0.0481 -1.0770 3.2600 235 | -0.3120 -2.5160 0.1285 236 | 1.1049 1.2375 -4.1662 237 | -2.3846 -2.2740 5.3708 238 | 1.2088 1.8491 -1.8488 239 | -0.4573 0.8092 -0.6449 240 | -1.8452 0.8789 1.4066 241 | -0.0849 -1.0167 -0.4697 242 | -0.7194 -0.3555 -1.6535 243 | -0.7408 -0.2844 1.4166 244 | -0.8514 2.2618 1.3513 245 | -1.2948 0.7566 1.6170 246 | 0.2009 0.7139 -1.1601 247 | -1.1279 0.9647 2.9146 248 | -0.0719 0.5783 1.6962 249 | 0.5571 2.9849 -4.8461 250 | 0.1562 -2.0022 -2.1049 251 | -0.0146 0.1885 -0.7663 252 | 0.3506 1.9329 -3.3834 253 | 0.4855 -1.1695 2.2794 254 | 1.0628 0.8436 -1.1688 255 | -0.5770 -0.9973 3.1523 256 | 0.8991 1.1788 -1.6000 257 | -0.7910 -1.2222 2.1015 258 | -0.2998 0.4506 -3.3165 259 | -1.6281 1.6956 -0.7569 260 | 0.6715 0.6107 -2.8276 261 | -2.2684 -0.9542 3.3964 262 | -1.1286 0.9167 -0.5281 263 | -1.7539 -1.9550 6.4621 264 | -0.8511 -2.0431 4.4231 265 | -0.8910 -2.2755 1.0011 266 | -0.3430 -0.8275 2.2324 267 | 1.2703 -1.4539 -1.0729 268 | 0.6159 -0.0833 1.8975 269 | 1.0449 2.4196 -2.9273 270 | 1.0669 0.3589 -3.8964 271 | 0.5818 0.3147 0.1133 272 | -1.6035 -1.2709 3.4055 273 | 0.4309 2.8284 -0.8090 274 | 2.6141 0.3865 -9.2050 275 | -0.6463 1.9626 -0.7736 276 | -1.4384 -1.9595 -0.6811 277 | 1.5436 -1.1574 -3.0688 278 | 1.8669 1.4194 -3.1750 279 | 1.1345 -0.6882 0.2532 280 | 0.0854 -2.6606 1.1112 281 | -0.1720 -2.3260 0.2972 282 | -0.3926 0.7879 0.3247 283 | 0.8083 -3.2362 1.5536 284 | -0.1682 2.4801 2.8603 285 | 0.4801 -0.0235 -1.2122 286 | -1.5012 0.7613 1.5672 287 | 0.3312 -0.6185 1.7271 288 | -0.0401 -1.1222 1.4906 289 | 1.6597 -0.6408 -1.1032 290 | -0.4155 1.0243 0.3208 291 | 0.2066 -2.6770 3.3956 292 | -0.5702 -1.8649 6.2854 293 | -1.4871 -0.5066 1.3696 294 | 0.0925 0.6615 3.2616 295 | -0.0374 5.1540 -2.0315 296 | 0.0198 -3.1432 2.6538 297 | 0.1480 -4.4698 3.5394 298 | -0.4085 -0.7235 1.2393 299 | 1.0391 -2.0578 -0.3743 300 | 0.3165 3.1746 -2.6325 301 | 0.3703 -1.9943 0.6294 302 | -1.3916 -0.7983 3.8962 303 | 0.4689 1.3203 -5.0496 304 | 0.8284 -0.6041 -1.1944 305 | 0.2891 1.8654 -1.4758 306 | -0.1384 2.9615 -0.4725 307 | 0.4141 0.5954 -3.0110 308 | 0.1640 -1.5880 0.4547 309 | 0.6119 -0.3221 0.3216 310 | -0.5101 -1.5410 2.5111 311 | -0.8468 -0.7400 1.5122 312 | -0.4789 0.4370 -2.4775 313 | -0.3572 0.5304 -3.2562 314 | 0.2958 2.4149 -4.1287 315 | -0.3468 -0.7577 0.9154 316 | 1.0863 -1.1519 -3.8317 317 | 0.6774 1.8903 -2.4271 318 | 0.8669 1.4571 -0.3616 319 | 0.6380 -1.3982 0.4040 320 | 1.6229 3.7827 -3.7928 321 | 0.6180 -1.0817 0.6754 322 | 0.5975 0.0743 -1.1124 323 | 0.9848 -1.9926 -0.2306 324 | -0.4918 1.6793 -5.2187 325 | 0.6661 -1.2915 1.1944 326 | 0.9091 -0.8969 1.7042 327 | 1.2932 -1.9601 -1.1354 328 | -0.6403 1.1810 0.4146 329 | -0.3454 -3.3770 -0.8429 330 | 0.4655 -0.0792 -0.7019 331 | 0.6916 -0.2152 0.6124 332 | 0.1932 -3.3264 -1.7663 333 | 0.1276 2.8836 0.2860 334 | 1.0330 -0.0114 0.1287 335 | 2.1294 1.1047 -3.3294 336 | -0.4547 -0.7981 2.8040 337 | -2.3857 1.1539 2.5673 338 | 1.0912 1.8221 -1.4017 339 | 0.2812 0.2672 -2.6632 340 | 1.0693 -2.0563 0.6294 341 | -0.8581 1.9287 0.2015 342 | 1.9535 -0.2910 -0.7864 343 | -0.8387 -1.5061 3.9909 344 | 0.2096 -0.9250 1.2090 345 | -0.0067 -0.6426 -2.1973 346 | -0.1780 0.0720 1.4560 347 | 1.2410 -0.7656 -0.5719 348 | -0.2986 -0.7402 1.2599 349 | 0.1591 -0.0210 -0.8006 350 | -0.4653 -0.2880 3.1089 351 | -1.3267 -1.0366 4.3198 352 | -0.4697 3.0419 -1.6195 353 | 0.4295 2.3728 -3.0471 354 | -2.1790 -0.1630 4.3953 355 | 0.7159 2.5533 -1.0698 356 | -0.1122 -0.7493 1.4854 357 | 0.4300 -0.8002 -0.3326 358 | 1.5860 -0.8260 1.0649 359 | 0.0778 -2.3349 -1.0456 360 | -0.0402 0.2427 2.5070 361 | -1.2811 -2.2916 5.7929 362 | 1.1994 2.6350 -4.4608 363 | 0.6597 -0.0881 -0.1552 364 | -0.2025 1.8555 -1.3619 365 | -1.3432 0.0759 -0.6736 366 | 0.2502 1.1461 -2.9861 367 | -2.1706 -3.7867 6.5889 368 | 2.4333 -1.9673 -3.3208 369 | 0.6870 -2.2446 -1.4866 370 | 0.5404 -0.4650 -4.0648 371 | -1.6682 1.6766 2.4133 372 | 0.4277 1.6586 -1.3622 373 | 1.0438 -0.0137 -0.6785 374 | -1.1358 0.3702 3.5342 375 | 0.8216 -1.2839 -0.2569 376 | 0.2810 2.4699 -0.4829 377 | -0.7446 2.0014 1.1952 378 | 1.2329 2.0325 -2.3723 379 | 0.1032 1.2384 1.7391 380 | -0.2749 1.5353 1.7235 381 | -0.0651 -2.5584 2.1093 382 | -0.2994 -1.2258 -1.2295 383 | -0.2105 -0.6036 0.9689 384 | -1.2442 -2.9778 3.6765 385 | 0.1908 -1.7405 1.1137 386 | -2.6488 2.6077 0.5376 387 | 1.1462 -2.2203 -0.2591 388 | 0.1388 -0.6665 0.9629 389 | -1.3173 -2.8530 5.8211 390 | -0.7899 -0.2697 -0.8084 391 | 0.5339 0.9325 -0.7124 392 | 1.9070 1.8827 -4.3889 393 | 0.5013 2.3157 -1.9965 394 | 0.9845 0.0388 -1.4837 395 | 0.4612 -0.0371 -2.6803 396 | -0.5751 -1.2993 2.6914 397 | -0.2021 4.3234 -1.6120 398 | -0.8848 1.3533 -1.7043 399 | -0.6569 0.6357 -2.1913 400 | -1.6452 -2.1025 2.1872 401 | 0.6464 2.0386 -2.9907 402 | -0.4624 -2.6273 1.6440 403 | -1.1890 0.9753 0.8833 404 | -0.3300 0.5924 -2.1506 405 | -1.2778 -3.1344 1.5452 406 | 1.5365 4.1925 -4.7739 407 | -0.2632 1.4513 -1.0609 408 | 0.0544 0.3655 -1.3904 409 | -0.9648 0.9959 -0.7428 410 | -0.5898 -0.1139 -1.0399 411 | 0.3746 0.4611 -1.3967 412 | -0.9379 -1.5389 1.1238 413 | -2.1790 -1.1781 4.3100 414 | -1.6313 0.2044 0.4496 415 | 0.1758 -0.3579 -0.7308 416 | 1.5968 -0.4743 0.2432 417 | -1.2300 -2.8925 4.8259 418 | 1.2658 -3.2168 -2.8706 419 | 0.4950 -3.0301 -1.1687 420 | 0.7963 2.1001 -1.8573 421 | 1.8884 0.2927 -2.0411 422 | -0.4692 -0.9602 -0.1438 423 | 1.2058 -1.2745 -2.7944 424 | 1.6075 3.5572 -1.4841 425 | -0.8645 1.8739 1.0835 426 | -1.3855 0.9809 1.3192 427 | 0.6242 -0.1499 -0.8700 428 | -0.9104 3.1818 -2.4417 429 | -0.6415 1.1610 -0.3276 430 | 0.2158 0.4422 -1.1135 431 | 0.7915 -1.7099 0.1015 432 | 0.5905 2.6152 0.1373 433 | -0.0253 0.2464 -2.3093 434 | -0.1664 1.7852 -1.9109 435 | 0.8606 0.6717 -1.3015 436 | 0.8204 -1.4269 2.2200 437 | -1.1497 1.5552 1.8907 438 | -0.3445 0.0489 3.9985 439 | 0.4223 0.5194 1.8082 440 | 0.1046 0.4591 0.8633 441 | -0.2287 -0.9487 -0.9906 442 | -0.1950 2.7155 -3.1638 443 | 0.7087 -0.0344 -1.0680 444 | -0.4453 0.6127 -1.2194 445 | 0.1784 -2.0133 2.4828 446 | -0.0183 0.1248 -0.1537 447 | -0.6184 -1.1293 -0.6803 448 | -0.3319 -1.9442 1.1947 449 | 0.7692 -0.5753 2.2391 450 | 0.2290 -0.3237 2.0731 451 | -0.2196 0.7089 0.3223 452 | -0.2203 -0.9883 -1.4272 453 | -0.9488 -0.7320 1.7130 454 | 0.4083 -0.1487 1.5533 455 | -0.4852 3.3702 -1.9793 456 | 1.5201 2.4664 -5.1262 457 | -1.1208 1.2902 -2.0578 458 | 0.9481 -2.2838 -2.4577 459 | 0.6235 0.6463 -2.8842 460 | -0.7729 2.6839 -0.0764 461 | -0.2645 -0.9074 0.7823 462 | 0.4640 -0.8680 1.8650 463 | -1.1709 1.9996 2.7479 464 | 1.0273 3.4896 -3.7911 465 | 0.4416 -0.9429 -0.7547 466 | 1.0910 -0.9689 1.5874 467 | -0.5646 -3.4024 4.3258 468 | -0.5387 0.2589 2.0970 469 | -0.4505 2.0285 -4.1134 470 | 0.1675 -1.8904 1.6573 471 | 0.6169 1.9289 -3.1132 472 | 0.3192 2.1870 -2.7918 473 | -0.6641 -0.0641 -0.8257 474 | -0.5469 2.4057 -2.7569 475 | 0.2235 -4.1247 1.6703 476 | -0.6467 -0.7809 -2.2825 477 | 0.8814 0.3799 -1.4891 478 | 0.8237 0.6553 -2.0749 479 | -0.2850 0.3540 -1.9830 480 | 0.7647 0.1544 -0.5801 481 | -1.0707 -0.7453 3.4260 482 | 0.7154 1.6495 -3.7736 483 | 1.6398 -0.8718 -5.6711 484 | 1.2405 -2.6132 -1.1999 485 | 0.2836 2.2006 -3.6808 486 | 1.0014 0.4414 -5.2846 487 | -1.2752 0.1004 4.5937 488 | -1.4588 -0.7642 1.6818 489 | 0.7518 -2.3086 0.9225 490 | -0.5522 -0.6260 1.3166 491 | 1.9177 1.0950 -2.9098 492 | 1.4974 2.2717 -1.6559 493 | -0.7023 1.0229 2.7253 494 | -0.1116 0.2732 -2.4855 495 | 0.4669 -0.4499 -2.5797 496 | 0.3958 -3.0181 1.9327 497 | -0.4935 -0.3747 4.6344 498 | 0.5913 1.6317 1.2920 499 | -0.8185 -3.7028 5.4694 500 | 0.8361 3.2535 -2.2691 501 | 0.5415 -1.3667 2.6463 502 | -0.4509 1.3289 -1.2549 503 | 0.7739 -2.2089 -1.2263 504 | 0.2150 -2.7797 1.9605 505 | -0.1637 -1.1095 -2.6037 506 | -0.8775 -0.8985 1.1150 507 | -1.7226 0.8263 1.4060 508 | -0.2978 0.9788 -2.1521 509 | -0.6078 0.6851 1.4465 510 | -1.1650 -0.4656 0.3401 511 | 0.1487 -0.5398 -3.3908 512 | -1.0622 0.7272 -0.2478 513 | 0.1922 0.4832 -1.3308 514 | 0.1079 -3.6846 1.2910 515 | 0.3141 -1.0516 1.0399 516 | -0.8150 -1.4273 -1.0252 517 | -0.7152 -2.4567 3.2242 518 | -0.6325 -0.3451 1.3740 519 | 0.0710 -0.9154 1.0856 520 | 0.4938 0.2255 -1.5967 521 | -1.0549 0.3084 1.1880 522 | 1.0308 1.6365 -1.7080 523 | -0.0811 -1.9413 4.2238 524 | 1.8943 -0.5163 -2.1074 525 | 1.2982 2.2106 -2.8454 526 | 0.6853 -1.7521 0.5694 527 | 0.9868 3.0256 -6.3787 528 | -0.2478 0.7401 -1.1251 529 | -0.2467 -0.2407 3.2768 530 | -0.5183 -3.0655 3.0077 531 | 0.2530 -1.3720 -2.2107 532 | 0.5794 -1.8065 3.1796 533 | 0.6162 -1.3585 2.3748 534 | -0.5111 0.6423 1.1155 535 | -0.7469 2.6513 -2.0013 536 | -0.2207 -1.9255 1.6286 537 | 0.5455 -0.6783 -1.6092 538 | 0.6988 -0.4853 2.3551 539 | 0.4803 -0.3657 0.6331 540 | 2.0743 -1.3677 -4.7342 541 | 0.3783 -1.0920 1.4240 542 | -0.0932 -0.0217 0.3739 543 | 0.2728 0.7739 1.0233 544 | -0.9578 -0.0145 1.1852 545 | -2.4568 -0.5410 2.9504 546 | 0.0230 -2.5967 3.8437 547 | 0.4373 0.9590 -2.0637 548 | 0.2506 -1.4241 -0.4418 549 | 0.0413 -0.6673 2.1263 550 | 0.1768 -0.1341 -0.9899 551 | 0.8697 0.7261 -1.1168 552 | 0.1950 -1.3376 -0.4102 553 | -0.4583 0.1420 1.1097 554 | 0.0155 -1.1614 2.8213 555 | 0.5059 -1.5232 0.1309 556 | 1.7822 -0.9151 -1.5728 557 | 0.3096 1.5285 0.1236 558 | 0.5556 -2.6425 1.4175 559 | 1.8673 -0.5856 -3.3362 560 | -0.3276 -0.6244 0.4465 561 | 1.5438 1.6947 -1.0373 562 | -0.1274 -0.2081 2.2012 563 | -0.5049 -0.1579 2.8369 564 | 0.1906 1.7033 -0.5680 565 | -0.2628 1.5870 -0.9232 566 | -0.3910 0.9559 -0.9153 567 | -0.6484 1.8158 -2.1426 568 | 0.1473 -3.5035 5.0981 569 | 0.4438 0.3112 -3.5197 570 | 0.6517 -0.4179 -0.2370 571 | 1.0049 -0.0248 -0.2713 572 | -1.1612 -0.8286 0.9597 573 | 0.2419 -2.0804 2.5810 574 | -2.3153 2.7316 0.9517 575 | -0.5788 -1.0377 1.8383 576 | -0.1556 0.7674 -1.1798 577 | -1.3739 1.7094 1.6150 578 | 0.9814 0.0228 -3.6819 579 | 0.8729 0.6398 -2.6539 580 | 0.2840 -2.3410 2.3134 581 | 0.8667 0.4650 -4.8674 582 | -0.9838 -1.5919 2.5063 583 | -1.4401 -3.8133 4.8801 584 | -0.5777 -1.5795 2.3883 585 | 1.9790 -1.4779 -2.2336 586 | 0.9375 2.0041 -1.4884 587 | 0.0656 2.4027 2.8385 588 | 0.7733 3.0587 -3.9030 589 | 0.1741 0.9626 5.9147 590 | 1.1150 0.7841 -1.7055 591 | 0.9798 4.8975 -7.3795 592 | -0.6698 3.3083 -3.2202 593 | 0.2300 -2.1966 -0.1216 594 | -2.6676 0.7031 5.5294 595 | -1.2745 0.7297 -1.4866 596 | 1.1822 3.7891 -2.1930 597 | -0.1746 -2.8679 1.6286 598 | 1.1952 -1.0631 -1.6999 599 | 0.6704 1.4330 -2.1902 600 | 1.5429 1.3379 -1.2086 601 | -0.0351 -0.8557 0.5519 602 | 0.6895 -2.6485 0.7767 603 | 0.7803 -1.2256 0.3235 604 | 0.3055 1.3072 -3.9902 605 | -0.1756 -0.7634 1.0970 606 | -0.7536 -2.0827 1.4243 607 | -1.1052 2.0448 2.2416 608 | -1.4000 0.9058 3.5352 609 | -0.8692 -1.7300 1.1478 610 | -1.2025 0.6942 -0.7769 611 | -0.0365 2.3204 -1.5813 612 | -1.8495 -2.8573 1.8544 613 | -1.0105 -0.3134 0.9502 614 | -0.6439 -2.4703 0.1816 615 | 0.9972 -2.6184 -0.3202 616 | -0.5734 0.2049 0.0031 617 | 0.1244 -1.7542 0.8802 618 | 0.4374 -0.1089 -2.3017 619 | -0.4450 2.5659 -1.6431 620 | -0.7072 -0.0062 0.2109 621 | 0.5190 0.9093 -1.7209 622 | 1.0734 0.5563 -1.6107 623 | -0.2107 -0.8682 0.5814 624 | 0.4868 -0.3298 -1.6871 625 | -0.4298 -2.1308 2.3678 626 | -0.0694 1.3934 -2.6284 627 | -2.6336 -0.8871 5.4283 628 | 1.2523 -0.2803 0.4606 629 | 0.1284 2.7203 -1.5365 630 | -1.8639 -0.2804 0.0393 631 | -0.1486 2.9866 -1.9920 632 | -0.1094 -3.4008 0.5404 633 | 0.6211 -3.2399 0.4168 634 | -0.4276 0.5230 0.0031 635 | -0.9022 -0.5562 0.4336 636 | 0.7592 1.1529 -0.1710 637 | -0.8159 0.3365 1.8838 638 | -0.9976 1.9248 -0.8289 639 | -0.8504 3.3659 -1.5923 640 | -0.6081 -1.2964 -1.1133 641 | 0.6894 -3.8735 3.7577 642 | 0.0044 -0.0889 0.3707 643 | 0.2268 -2.3111 0.8408 644 | -0.1891 -1.0543 -0.6226 645 | 0.0845 -1.4012 -0.6607 646 | 0.4259 -2.0616 -0.5494 647 | 1.3966 -1.4942 -3.4130 648 | 0.4081 0.1873 0.3694 649 | 1.0640 2.3934 -5.1100 650 | -0.8545 1.4081 0.6680 651 | -0.0320 0.8642 1.4850 652 | 0.8599 -0.8230 -0.5073 653 | 1.2790 0.4386 -2.5647 654 | 0.5557 -0.8829 -2.6852 655 | 0.2331 -0.2212 1.1722 656 | -0.4563 -1.5572 4.0192 657 | -0.3626 0.4691 1.5748 658 | -0.5601 -0.2652 2.0080 659 | 0.8532 -1.2277 0.5873 660 | 0.4932 -0.9124 -2.1526 661 | -0.2782 0.9147 -0.9315 662 | 2.2660 2.2636 -5.7953 663 | -1.0375 -0.0867 1.2309 664 | 0.0116 1.7813 -1.7751 665 | 0.4562 -2.8420 2.1352 666 | -1.3965 0.7735 -1.7720 667 | 2.0985 1.0871 -4.1825 668 | 0.0824 0.4299 -1.2516 669 | -1.0092 2.4983 -1.6641 670 | 1.3047 2.2322 -5.2020 671 | 0.6167 -0.1650 -1.2714 672 | -0.5355 -0.9141 1.1169 673 | 0.3670 1.0032 -3.0471 674 | -0.7900 -0.0528 1.9038 675 | -1.8485 -0.8856 2.6529 676 | 0.5623 -3.5773 4.5523 677 | -0.3771 1.0861 2.2947 678 | 1.1178 -0.7161 0.5287 679 | 0.1910 -2.5372 0.3618 680 | 0.3544 -2.1499 0.8273 681 | -1.0067 -0.2087 4.6531 682 | 1.2778 -4.0693 1.8174 683 | 2.1474 -1.6038 0.6734 684 | 0.8705 0.5140 -1.7869 685 | 2.4142 1.1991 -5.9608 686 | 1.2389 -1.1693 -2.5197 687 | -1.8546 0.2106 3.1319 688 | -0.8854 0.1236 -0.7367 689 | 0.8929 0.1395 -1.6198 690 | -0.7508 -0.2234 -0.6322 691 | -0.0002 0.6225 0.3548 692 | -1.3097 0.5854 2.9335 693 | 0.0325 1.1051 -1.1795 694 | 1.2889 -0.6834 -0.4149 695 | -0.7575 0.2540 -0.8255 696 | 1.2961 0.5673 -3.1792 697 | 2.0716 0.8915 -3.4760 698 | -0.7617 -1.6051 2.9135 699 | -0.8960 -0.7453 1.4793 700 | 0.5429 1.0775 -4.2415 701 | 0.7043 -1.0076 2.4761 702 | -0.3767 -1.1713 2.4143 703 | -0.2667 -2.4308 3.2064 704 | -1.6363 0.5189 1.0895 705 | -0.3399 -3.7093 3.2907 706 | 0.0196 -0.9340 -0.0856 707 | -0.7335 -2.7772 3.8713 708 | -0.4590 -2.6285 2.7894 709 | -0.0492 0.3481 -1.2482 710 | 1.3318 0.7238 -1.4188 711 | 0.2145 0.4124 -1.3504 712 | 2.0645 -1.0724 -1.5921 713 | -0.6721 -0.9178 3.1087 714 | 0.5456 2.0196 -2.4957 715 | 0.5227 -1.2729 1.8078 716 | -0.3891 -1.9340 1.8406 717 | -0.9420 -3.0726 2.4798 718 | -2.1882 0.1092 1.6957 719 | 0.2972 -1.1200 3.2561 720 | -0.3789 2.6302 0.7057 721 | 0.4286 -2.2846 3.8287 722 | -2.0772 0.1328 1.7194 723 | 0.9892 2.0309 -3.6449 724 | 0.0070 -2.9022 1.1377 725 | 1.4908 -2.1473 -2.7900 726 | 0.2737 0.6679 -1.2748 727 | -0.8114 1.6084 -2.3816 728 | 0.3064 1.2581 -0.1413 729 | 0.2756 -4.3317 3.3299 730 | 1.9740 -3.6888 -0.2313 731 | 1.7097 -0.9592 -0.0399 732 | 0.6661 -0.6771 1.1470 733 | 0.0479 0.2881 1.8357 734 | 1.1871 1.4205 -2.3936 735 | 0.0801 -1.4284 -0.8818 736 | 1.8179 1.3108 -2.8368 737 | 0.7342 1.2448 -1.4105 738 | -1.1004 -0.8228 1.4999 739 | -0.6732 0.2717 3.7674 740 | -0.1942 -0.6086 -1.2368 741 | 0.4372 -4.3730 3.3812 742 | 0.0910 1.4168 0.4345 743 | 0.1469 -2.4516 2.4109 744 | 0.3307 0.8454 0.8855 745 | -0.2353 4.5001 -0.1819 746 | -2.0366 -0.4386 4.0323 747 | -0.7039 -2.6787 2.5227 748 | 1.7392 -2.8947 -2.8208 749 | 0.9721 1.8310 -6.1813 750 | 0.1271 -1.3028 -0.1038 751 | 1.6030 4.3398 -6.2278 752 | -0.2170 -0.0743 1.1493 753 | -0.2027 0.3025 -0.2173 754 | 1.1804 1.5617 -5.5390 755 | -0.6188 -0.2099 2.5412 756 | -0.9972 1.4982 0.5328 757 | -0.6462 2.8395 0.5079 758 | -0.1213 1.5612 -1.8062 759 | -0.7791 -0.5228 2.0555 760 | 0.0876 -0.5901 -1.3081 761 | 0.3937 1.8899 -3.1028 762 | 2.3646 0.7403 -5.5173 763 | 0.1992 1.4604 -3.4213 764 | -0.8743 1.8549 -2.1294 765 | 0.9433 -2.3873 2.8670 766 | 0.6889 -0.1076 -0.7907 767 | -0.5686 -1.6047 3.0658 768 | 1.2103 -2.0370 -3.1381 769 | 0.3702 -0.1917 0.7730 770 | 0.8753 2.5134 -2.8666 771 | -1.2284 -1.4720 4.7505 772 | -1.2080 5.4442 -3.3891 773 | 1.2385 0.6956 -1.6249 774 | -0.6339 1.9172 -0.6977 775 | 0.4940 2.0313 -0.9569 776 | 0.5507 -2.9352 2.3622 777 | -1.2344 2.2320 -0.3269 778 | 0.3940 -0.5095 -1.3472 779 | -0.2165 0.7620 -1.8072 780 | -0.4519 -0.7435 4.0167 781 | -0.2831 -2.1187 2.7310 782 | -1.5735 -2.9911 5.8275 783 | 0.3633 0.6216 -1.0455 784 | 0.0882 0.4901 -0.0306 785 | 0.4161 0.3398 -0.6149 786 | 1.5518 -0.3676 -0.0961 787 | 0.5984 1.1960 -0.9847 788 | 0.1869 -1.0560 -1.4569 789 | 0.2263 -1.6788 2.6386 790 | -1.1469 0.7425 -0.1019 791 | 1.6637 0.8959 -2.8419 792 | -0.1515 1.3152 -0.9111 793 | -1.4014 4.1367 0.3908 794 | -0.0044 0.4976 1.7605 795 | -1.2940 1.8854 0.7262 796 | -0.3246 1.0976 0.4036 797 | 0.0625 -1.0852 0.5678 798 | -0.7272 4.8726 -2.7230 799 | 0.4228 0.0614 0.4666 800 | 0.0607 -3.0197 2.9111 801 | -0.4947 -1.0641 1.9963 802 | -1.4132 1.3150 1.0277 803 | -0.0992 -0.0679 -0.7884 804 | 1.1419 1.0097 -5.4861 805 | 1.0228 0.3323 -2.3881 806 | -0.2902 1.1148 -1.1814 807 | -0.0430 0.3129 -0.8216 808 | -1.1122 1.7525 3.1786 809 | 1.2206 1.4444 -1.9224 810 | -1.1267 0.5041 3.3534 811 | -0.0701 -1.9973 2.5239 812 | 0.4053 -0.9926 1.2551 813 | -0.0375 -0.0384 -0.6804 814 | 0.0823 0.4185 -3.8865 815 | -0.5544 -4.0449 4.6323 816 | -1.4217 0.8489 2.0305 817 | 1.3316 2.9226 -5.5131 818 | -2.1504 -4.5697 5.0449 819 | -0.0574 2.1042 -1.5029 820 | 0.5682 1.2154 -4.3737 821 | -1.3171 0.2025 0.9887 822 | 0.0851 -2.7432 3.0755 823 | 0.4372 -1.0720 1.3697 824 | 0.5203 1.3457 -3.2778 825 | 0.5634 -3.1488 3.9998 826 | -0.2095 2.9142 -1.3116 827 | -0.9101 0.2031 0.5608 828 | 0.6400 2.4870 -1.5830 829 | -1.7463 -0.3120 1.3487 830 | -2.2135 0.0323 4.5797 831 | 0.6014 2.2321 -5.5287 832 | -1.6896 -0.3941 3.5481 833 | -0.9000 0.3726 0.8896 834 | 1.6125 -2.1033 -0.2021 835 | 1.2224 1.2172 -0.7842 836 | 0.4437 2.7468 -4.2819 837 | 0.4386 1.9135 -2.2470 838 | -0.5949 3.5965 -4.7408 839 | -0.5280 1.7752 -0.7169 840 | 0.2093 0.3187 -0.9048 841 | -0.8402 2.1019 0.5080 842 | 0.0979 -1.4626 0.4036 843 | 0.6453 -0.1291 -0.8761 844 | -1.9177 -0.9365 6.0281 845 | 0.6057 -2.0078 1.4632 846 | 0.3993 2.8601 -2.9472 847 | -0.0491 0.8524 1.9755 848 | -0.1295 0.8009 2.4826 849 | -1.1988 2.1601 -0.4097 850 | 0.5628 0.0442 -2.4073 851 | 0.1473 1.0974 -0.1966 852 | 0.0374 1.5049 0.2982 853 | 0.0159 0.6225 0.6155 854 | -0.4851 0.5514 0.6441 855 | 0.7190 -1.2295 -3.7323 856 | 1.7101 1.8781 -3.7144 857 | 0.1029 0.5478 0.6940 858 | -0.5656 0.5632 -2.5533 859 | -0.3323 0.1008 2.1883 860 | -0.2746 1.8912 -0.0072 861 | -2.9762 -3.0520 5.6880 862 | 0.9627 1.0573 -1.7740 863 | 0.4069 -0.4520 -3.1970 864 | 0.9892 -1.1602 -0.3896 865 | 0.2400 1.4736 -0.5366 866 | -0.0979 2.3615 -2.9847 867 | -1.2266 0.2490 2.6118 868 | 1.2510 1.7774 -3.2399 869 | -1.7885 1.5466 -1.5805 870 | 0.7856 0.6086 -1.1472 871 | 1.0047 0.6843 -4.6216 872 | -0.8928 1.8376 -0.1201 873 | 1.9743 1.4277 -4.0594 874 | -1.1952 0.9800 -0.5345 875 | 1.1390 -1.4877 -0.4946 876 | -0.0966 1.1006 -0.8143 877 | -2.6498 1.2714 0.7561 878 | -1.3700 1.4884 -2.6752 879 | -0.7631 0.1441 0.9364 880 | -0.4335 -1.7927 3.5638 881 | -0.3094 0.9619 -2.6675 882 | -1.3941 -0.5125 -0.2600 883 | -0.2657 0.8864 -0.3590 884 | -0.0028 -0.5612 1.9069 885 | 0.5031 -2.7019 3.7896 886 | 1.2540 3.1087 -3.8960 887 | 0.9532 1.9237 -4.3669 888 | 0.9420 -1.2149 -2.8146 889 | 1.0953 -1.0769 -1.0557 890 | 1.0606 -0.9607 -1.8553 891 | -0.6265 -2.4699 2.9370 892 | -0.6039 1.0831 -2.8658 893 | -0.0425 1.1346 -1.3895 894 | -0.1429 0.1193 -0.7477 895 | 0.5607 2.0749 -2.4954 896 | -0.1667 1.5844 0.0921 897 | 1.7477 3.3760 -4.9921 898 | 0.4839 3.9617 -3.0886 899 | 0.3367 -4.4135 2.4641 900 | -0.3804 0.3135 -0.4265 901 | 2.4944 0.6615 -3.5929 902 | -1.8550 1.1602 0.9342 903 | 2.0130 -1.1951 -1.8099 904 | 0.4184 -1.2231 -0.3721 905 | -0.5746 -3.3731 3.8456 906 | -0.0271 1.9273 -2.5786 907 | 0.8176 1.8801 -0.8791 908 | 0.6807 1.1615 -0.6308 909 | 1.2910 1.5704 -3.5147 910 | -1.0358 0.0871 1.6014 911 | 0.7847 2.4066 -3.9717 912 | 0.9113 0.2255 -2.5213 913 | 0.0092 -0.2948 1.2037 914 | 1.9317 2.1325 -3.3859 915 | 1.1510 1.2650 -3.0147 916 | -0.4157 -0.9435 2.4275 917 | 0.0129 0.8263 -0.4513 918 | 1.7694 0.5046 -1.1824 919 | -0.8860 -1.2893 -0.9090 920 | -0.6377 1.4092 -1.3271 921 | 0.5750 -2.2653 -1.4286 922 | -0.2121 -1.2086 1.2617 923 | 0.1116 -0.1609 1.6958 924 | 0.5416 -0.8037 -1.6919 925 | 1.2403 -2.3281 0.2951 926 | -0.4888 1.9170 -1.5866 927 | 1.6430 0.4885 -5.8927 928 | 1.7829 1.6126 -2.9355 929 | 1.4157 1.3246 -5.0875 930 | -0.0829 -2.6627 4.8165 931 | 0.4704 -2.2992 2.2848 932 | -0.0168 2.2702 -1.2156 933 | -1.0543 -0.6726 -0.3825 934 | -0.2448 2.8178 -1.7861 935 | 0.4240 3.3976 -2.1006 936 | -0.1584 2.2219 0.5450 937 | 0.0894 -0.1042 -0.6320 938 | 0.0710 -0.3543 -0.5467 939 | 0.3269 -1.0989 2.2095 940 | 0.6743 0.7929 -3.5553 941 | -0.3011 1.0315 4.5546 942 | -0.7979 0.7749 -2.2280 943 | 1.5191 3.4595 -8.6227 944 | -0.3539 -2.8257 0.6184 945 | 1.1973 -2.9076 0.6748 946 | 2.0218 -2.3325 -1.9215 947 | 0.9058 0.6329 3.0691 948 | 0.6626 0.5451 -0.3513 949 | -0.3561 0.4800 0.2932 950 | -0.7267 -0.8662 2.6447 951 | -0.8789 -1.0501 1.6011 952 | -0.0146 0.6406 -0.7848 953 | 0.9903 2.5993 -4.8354 954 | -0.9992 -2.3783 0.6957 955 | 0.7439 -2.1535 1.1709 956 | 0.3018 -0.1487 4.6337 957 | -1.1614 -0.4968 1.7557 958 | -0.5196 -1.2995 2.9900 959 | 0.6166 -1.8249 -0.3863 960 | -1.6423 -0.3793 0.0888 961 | 1.0838 1.7636 -2.1946 962 | -0.4569 -0.9040 0.9600 963 | 0.2669 -3.8707 1.1191 964 | 0.9581 3.0635 -2.6265 965 | -0.8461 -0.6187 1.0651 966 | 0.6063 -1.6857 -0.0578 967 | -0.0815 1.6645 1.0141 968 | -0.3193 -0.3253 -0.2656 969 | 1.6110 2.1848 -3.4172 970 | -0.6893 2.2022 -2.1822 971 | 0.9476 -1.5016 -0.7381 972 | -0.8235 -1.0771 3.8707 973 | 0.7756 1.4879 -1.6864 974 | -0.4442 -0.5738 0.9628 975 | 0.1257 -0.1919 -0.6149 976 | -1.6379 0.3830 4.8343 977 | 0.8200 -0.9686 -2.4793 978 | -1.0920 -0.6631 -0.3192 979 | -0.4553 -0.4915 -1.1676 980 | -0.6804 1.9010 0.6671 981 | -2.2468 2.1263 2.4203 982 | 0.4163 -0.8516 1.6201 983 | -0.5521 -3.0539 3.4095 984 | 0.3359 -2.1168 0.3021 985 | -2.0478 1.9609 3.6934 986 | -0.4933 -2.4007 1.9448 987 | 0.3634 -1.4716 1.4597 988 | 1.6697 2.8742 -2.2917 989 | -1.1754 -0.7956 0.4925 990 | -1.8815 0.8858 2.4103 991 | 1.2236 0.2958 -0.8644 992 | -0.1010 -2.6666 -0.6651 993 | -0.4549 -2.0165 1.0625 994 | 0.7573 -0.1949 -0.6306 995 | 0.6815 1.8460 -2.2371 996 | 2.3622 1.4018 -5.8440 997 | 0.4919 0.8900 -0.7791 998 | -2.5604 0.5772 1.1980 999 | 0.4326 -1.1828 1.1779 1000 | 0.6565 -0.4224 1.2812 1001 | 0.1774 -2.9787 1.3059 1002 | -------------------------------------------------------------------------------- /data/collider_5.txt: -------------------------------------------------------------------------------- 1 | X1 X2 X3 X4 2 | 0.3411 2.4042 -2.7309 -0.7160 3 | 0.7290 1.2013 -2.9588 -0.5622 4 | 1.6729 0.3517 -1.9430 -3.0258 5 | 0.3096 -1.4417 0.1555 -0.5141 6 | -1.8845 -0.3324 1.5542 2.7901 7 | -0.5233 -2.2836 2.0699 1.7801 8 | 1.6323 -0.0473 -1.5845 -3.1928 9 | 2.6754 0.8077 -2.0033 -4.8654 10 | 0.6304 -0.0401 -1.5636 -4.4082 11 | -0.0549 0.7124 -0.1761 0.5413 12 | -0.4266 0.0246 -0.6581 -0.7382 13 | 0.8557 1.4512 -2.4940 -1.4347 14 | -0.0171 -0.4352 0.6203 -1.6252 15 | -0.9959 0.9290 -0.3329 1.7076 16 | -2.0722 -0.8817 2.2211 2.9998 17 | -1.7186 1.7975 -0.1282 2.3517 18 | -0.4030 -1.1166 0.5673 -0.7350 19 | -0.6124 -1.0493 1.1091 0.3239 20 | -0.6702 -1.9890 2.0309 4.8827 21 | 3.7374 0.6900 -4.5156 -5.4249 22 | 0.7593 -1.4717 2.1702 -2.6993 23 | 0.5292 0.0101 -2.1892 -0.3359 24 | 0.3970 -1.8412 0.8914 -0.4916 25 | -0.9299 -0.8737 1.3707 0.3822 26 | 1.1166 -0.9661 0.1240 -3.4790 27 | -1.2555 0.4469 0.3784 0.2211 28 | 1.4424 -0.3054 -1.0296 -3.4740 29 | -1.1488 0.7690 0.2673 2.7539 30 | 0.9678 1.0506 -0.6658 -1.1761 31 | 0.3514 2.7608 -2.8240 0.0708 32 | -1.3804 -0.2967 2.1990 1.2934 33 | -1.0809 -0.9877 2.5134 2.4754 34 | 1.4608 0.2750 -0.4643 -2.3781 35 | -0.6966 -0.4893 1.9401 3.6462 36 | -0.7881 -1.9041 3.4398 -1.0253 37 | -2.1722 -0.1923 1.5797 2.2609 38 | 1.8174 1.8073 -3.3697 -2.7750 39 | -0.7475 -1.5030 2.7176 1.3412 40 | 1.0173 -1.2902 -0.0663 -0.0069 41 | -0.1615 1.9294 -4.0193 1.8541 42 | -0.5748 -0.3202 1.3200 2.4133 43 | -1.1685 -0.0768 2.5194 1.9970 44 | -0.2126 -1.2685 2.2046 1.3999 45 | -1.0464 0.3672 1.6161 0.1425 46 | -2.3267 0.8607 1.0541 2.4690 47 | -1.9539 0.9987 0.1051 1.2321 48 | 3.6461 0.1582 -3.1530 -6.3531 49 | -0.9065 0.4115 1.9341 0.8339 50 | 2.1928 1.3224 -2.7755 -3.1842 51 | 0.2386 1.6939 0.2476 0.1287 52 | -0.6242 2.1098 -1.3863 1.0942 53 | 0.5044 1.0454 -0.6192 -2.8114 54 | 0.9365 -1.7828 -1.0134 -1.6601 55 | -0.9296 -1.1985 -1.5116 2.4471 56 | -1.0964 0.8336 1.5992 0.9111 57 | -1.7580 0.8832 0.0317 2.3224 58 | -0.6320 -1.7704 2.3145 -0.5251 59 | 1.7320 0.5989 -2.1342 -0.2518 60 | -2.7803 0.2246 2.8288 4.9774 61 | 0.5977 0.3936 0.1141 -5.1668 62 | 1.6267 0.5391 -2.6582 -0.9387 63 | 0.2257 0.5744 -2.0453 -0.2799 64 | -0.1244 -0.3079 0.6217 -2.8477 65 | 0.4178 0.5938 -1.3026 0.6736 66 | -2.4240 -0.1915 1.9394 1.6595 67 | -0.3200 -0.5290 1.3608 0.1053 68 | -0.2711 -0.2285 0.7589 2.3351 69 | -2.0769 -2.0457 4.3621 -0.3176 70 | 0.2448 0.1369 0.3841 -0.1960 71 | 1.9563 1.9001 -1.7987 -4.6786 72 | 0.5279 1.0052 -0.4629 -2.2633 73 | -0.2974 -0.7097 2.4803 0.8162 74 | -1.0234 1.2175 2.1856 -0.5048 75 | 1.0905 -0.8068 0.0980 -2.3410 76 | -0.0855 0.5519 -0.5142 0.8899 77 | 2.4602 0.5366 -4.5404 -6.5170 78 | 1.6912 -0.3711 -0.9148 -2.1933 79 | -0.1867 0.2273 2.0432 -0.3138 80 | 2.9617 1.0126 -1.7753 -6.2433 81 | -1.7394 -0.0998 1.1763 1.8108 82 | -1.6196 1.5710 0.6016 2.0248 83 | 0.1636 -0.9657 0.2297 0.9335 84 | -0.3530 -0.2258 0.5525 1.2017 85 | 0.7028 2.3152 -2.2911 -3.7442 86 | -0.3768 -0.3927 3.6198 1.3408 87 | -0.3686 -0.4532 -1.1912 1.5279 88 | -0.5629 -0.0435 2.6143 1.7727 89 | 0.7314 -1.3178 -0.6782 0.0067 90 | 1.1929 1.1898 -4.4034 -1.6804 91 | -0.8873 -0.3301 1.5133 0.9344 92 | -1.5190 -1.1777 2.9939 1.1257 93 | 1.6624 -2.1171 0.8085 -1.7456 94 | 0.4110 0.2126 1.3269 -0.4622 95 | 1.0319 0.9566 -3.6901 -2.2194 96 | -1.0043 1.8714 -0.2636 0.9089 97 | 2.0059 0.6133 -0.7630 -3.2911 98 | 0.4872 -0.3316 2.7334 -2.1955 99 | 0.5883 1.7801 -1.9742 0.1135 100 | -1.4580 -0.0376 0.4683 1.7607 101 | -0.1916 -0.4198 1.8790 -0.8556 102 | -1.4837 1.8155 2.1336 2.8061 103 | -0.5337 0.9839 1.1293 -0.5282 104 | 1.6407 0.3349 -0.0267 -1.5050 105 | 0.6238 -1.8517 0.6203 0.1958 106 | -2.5333 2.1405 0.7495 3.0502 107 | -0.5257 -0.9685 1.8178 -0.0828 108 | 0.6999 -0.8113 -0.4740 1.2444 109 | 1.0557 1.1411 -1.4599 -4.1805 110 | -0.3433 -2.9020 4.7781 0.2236 111 | 0.5217 0.1654 -1.4771 1.6743 112 | 2.0238 -1.8289 -1.7135 -0.9162 113 | -2.2240 0.4801 1.2021 5.0573 114 | 1.1461 -0.4141 -1.0632 -1.2819 115 | 1.8664 0.4090 -2.7536 -0.7755 116 | -1.9743 0.7479 0.9804 3.3617 117 | -2.1489 0.9580 1.6971 2.4538 118 | 1.4355 -1.4944 1.4733 -1.1728 119 | 0.1738 -0.5645 -0.7992 -2.1144 120 | 0.0901 0.6463 -1.3093 0.6227 121 | -0.7281 0.1559 0.6058 1.4292 122 | 0.8046 -0.9338 -0.6133 -0.3955 123 | 2.3956 -1.2237 -1.3792 -2.8080 124 | 2.8278 0.6949 -5.1084 -3.0941 125 | 0.0938 -1.8694 1.0200 0.3269 126 | 1.8513 1.6712 -3.4822 -3.7860 127 | 0.1088 -0.2897 -0.4138 0.7781 128 | -0.1073 -0.0083 -0.8459 -0.0132 129 | 0.6670 -0.0755 -0.1446 0.1180 130 | 0.2086 1.2179 -0.3843 0.6610 131 | -0.9523 -0.0960 0.7736 2.4745 132 | -1.5776 -1.9706 2.1612 1.1536 133 | -0.9036 -0.9843 0.5070 2.6768 134 | 0.2362 -2.5126 4.0380 -0.9374 135 | -1.1661 0.0179 2.5292 0.6581 136 | 0.0743 1.3307 -0.7469 0.7069 137 | 0.7710 -0.3934 -0.8306 -1.6090 138 | -0.3029 -1.2925 -0.2811 1.4974 139 | 1.5642 0.5851 0.0480 -1.9128 140 | 0.2376 -1.1342 -0.7584 -1.9677 141 | 0.2356 0.3576 -1.6387 -0.3856 142 | 2.0256 2.3676 -4.0014 -1.6983 143 | 1.0638 -0.2230 1.4519 -1.7759 144 | 1.5696 -0.0213 -1.5929 -2.6401 145 | 1.5092 1.1245 -3.5357 -1.8973 146 | -0.8473 -0.5412 1.6849 2.5692 147 | 0.9661 -0.4296 -1.3711 -0.1204 148 | -1.0328 -0.0851 1.0845 2.7709 149 | -2.8313 1.8259 1.2051 5.5837 150 | -0.1831 -0.4562 1.5318 1.3124 151 | -1.0032 -2.4647 2.3802 4.2383 152 | -0.8411 -0.1665 -0.4396 1.4439 153 | 0.9924 0.3271 0.3042 -4.4135 154 | -2.0213 1.1423 1.0500 3.7076 155 | -0.0989 -0.4600 -0.0287 0.3529 156 | -1.4535 1.9188 -2.4567 1.3240 157 | -1.1204 -0.0499 0.4591 2.1006 158 | -0.1537 0.4462 -2.9080 0.3483 159 | 0.3714 -2.2912 0.9333 0.4463 160 | 1.3425 -2.6380 1.4324 0.4234 161 | 0.3575 0.1225 -0.1850 -1.7146 162 | 0.7206 1.8968 -1.3037 -1.3447 163 | 0.3865 -0.4463 1.6234 1.2099 164 | -1.0819 -0.4165 3.1390 1.7719 165 | -0.5861 0.7295 0.6409 -0.8569 166 | -2.4558 -0.7085 3.3759 3.5320 167 | -0.1128 1.8003 -0.0109 -2.8045 168 | 0.0800 1.7443 -1.4632 -2.7264 169 | -0.3858 -2.4176 2.8076 2.0060 170 | -1.1604 0.0195 1.3773 4.3832 171 | -0.8627 -0.1281 -1.3214 -0.9502 172 | 0.9266 -0.4145 -1.7691 -1.7310 173 | -1.7231 2.0692 0.2517 1.8568 174 | -2.3086 -0.4578 1.6574 2.9843 175 | -0.6486 1.4905 -0.0466 0.7442 176 | 0.5969 -1.2445 2.1217 2.6697 177 | -1.5879 0.9533 -0.0671 2.9362 178 | 2.6947 -0.0451 -1.4981 -5.3526 179 | 0.7474 1.4750 -2.2410 -0.1099 180 | 1.2673 1.7982 -2.8332 -1.0984 181 | 1.0167 -0.4659 -1.4477 -0.2601 182 | 0.8263 1.3368 -2.9995 -2.5377 183 | 0.1875 0.9879 -2.1974 1.7679 184 | -0.4536 0.9661 -0.0148 0.9418 185 | -0.1567 -0.1753 0.5911 0.9759 186 | 0.2399 -0.8817 1.5942 2.3870 187 | -0.4031 -0.1583 1.1970 1.9921 188 | -0.4596 1.1261 -0.6687 2.4065 189 | 0.2656 2.3007 -1.1115 -2.5974 190 | 1.4834 0.6500 -1.2544 -2.0055 191 | 1.1315 -0.8040 -1.7315 -1.3264 192 | -0.1856 1.4554 -2.8222 -0.3525 193 | -2.7191 -0.5089 3.2685 5.0877 194 | 1.4394 -0.3624 -3.3509 -3.7952 195 | 0.3257 -0.6707 3.0956 -1.5056 196 | 0.5568 -1.7177 -1.5716 1.9414 197 | 0.2370 -0.4311 0.7414 1.1741 198 | 2.4574 2.3876 -3.6998 -5.2536 199 | 0.1170 -0.5250 -1.4726 -0.6611 200 | -2.3979 -1.3714 2.0394 1.6436 201 | 1.1338 -0.0720 -1.2774 -0.0184 202 | -1.3767 1.3230 -0.7620 -0.0242 203 | -1.1361 3.6849 -2.4034 1.0340 204 | 2.1786 1.0071 -3.3056 -1.7772 205 | -0.5343 -1.1528 0.6364 -0.6077 206 | -1.9641 -1.0584 1.1450 1.7244 207 | 0.0700 -0.5360 -0.0691 -0.9412 208 | 0.3060 -0.8591 -0.5489 2.0720 209 | 1.7935 0.4778 -1.8380 -1.4346 210 | 0.2444 -0.0766 0.3870 -2.2446 211 | 3.9763 0.5331 -3.9668 -6.1428 212 | 1.1618 0.4152 -2.2597 -3.5332 213 | -0.8673 -3.1146 4.1059 2.2282 214 | 0.9415 -0.9396 0.4644 -0.7992 215 | 1.3708 0.9963 -2.3084 -0.2695 216 | 0.8514 -1.5102 0.9227 0.0140 217 | -0.6228 2.5899 -3.2144 -0.7179 218 | -0.1800 1.3901 -0.6488 0.1858 219 | 1.2328 -0.6689 0.5970 -0.0269 220 | -1.7251 2.5931 0.4002 4.4481 221 | -0.6810 -0.1881 0.4666 2.6144 222 | -0.5730 2.1918 -0.3723 1.7391 223 | -0.8952 -2.3713 2.9462 -2.1501 224 | -0.6120 -0.7797 0.1759 -0.1179 225 | 0.2928 0.7600 0.0061 0.2248 226 | 0.4955 -0.1316 -2.7636 -0.1957 227 | 0.7662 -1.0028 -0.4409 -1.9794 228 | -0.0624 0.8034 -0.6846 -1.7019 229 | -1.4535 1.5328 0.8868 0.8422 230 | -1.9072 0.5401 0.3414 0.8110 231 | 0.5327 0.3286 0.7527 -1.7560 232 | -0.6595 4.3424 0.1220 0.3916 233 | -0.5215 -0.9043 1.0217 0.1810 234 | 0.7258 -1.8901 0.8132 -2.0313 235 | 0.5154 -1.9842 0.9533 -1.3731 236 | 0.4045 0.7327 -1.1952 0.4754 237 | -3.1797 0.8949 1.9863 3.3509 238 | 1.0740 -0.8084 0.2763 -1.1935 239 | -1.7960 -0.0187 1.7740 0.6682 240 | 0.7441 -0.9647 0.9315 -0.1062 241 | 1.8131 0.8047 -3.3330 -3.1639 242 | -1.3795 -0.0029 0.6516 0.6998 243 | 1.8520 -0.1523 -0.9945 -4.1174 244 | -0.9588 -1.6728 3.1850 3.7717 245 | 1.2578 0.7965 -0.4046 -3.6951 246 | 2.6440 -0.9892 -1.0937 -0.9358 247 | 0.7264 0.4526 -0.6746 -0.3211 248 | 0.0359 -0.7785 1.1888 1.3371 249 | 1.6521 0.4801 -2.4243 -2.4316 250 | 1.0517 1.7430 -2.5435 -4.3184 251 | 0.9402 0.1955 0.6380 -0.4503 252 | -2.1345 2.2560 1.6121 2.6252 253 | 1.2691 -0.2979 -1.8756 0.3775 254 | -0.9723 0.1519 -0.1165 1.7808 255 | -0.7636 -1.9437 2.5902 0.4629 256 | 0.8594 0.6671 -2.9903 -1.1536 257 | -1.5447 -1.7721 2.7115 2.2037 258 | -0.4058 -0.1209 -1.5289 3.3357 259 | 1.0494 2.9380 -4.7786 -3.1036 260 | 0.4633 -4.2669 3.7000 -1.7105 261 | -0.0993 0.9984 -0.4197 1.2682 262 | 0.5996 2.3227 -3.1197 -0.3862 263 | -2.5564 -0.8718 2.6513 2.4441 264 | 0.2676 0.0187 -3.6161 0.0910 265 | 1.7030 0.9577 -2.9121 -1.5440 266 | 0.0844 1.7642 -1.3171 -1.3356 267 | -0.4432 -0.2331 1.6445 2.5670 268 | 0.1173 -2.0729 1.5214 0.3463 269 | -2.3268 1.6441 0.9693 1.4807 270 | 0.2442 0.5924 -0.3331 1.0727 271 | 0.3513 -1.6275 0.9091 -0.9964 272 | -1.4813 0.1498 0.0581 2.5020 273 | 2.3947 -0.8734 -1.1419 -3.7184 274 | 1.1624 0.8379 -1.1220 -1.9408 275 | 1.8596 -1.4381 1.1288 -2.7979 276 | 1.5988 1.3996 -1.4702 -1.9811 277 | -0.5039 -0.1993 0.4877 0.4607 278 | 0.4893 2.4756 -0.7496 -1.4381 279 | 1.8916 -0.1024 -2.0057 -0.3569 280 | -0.8170 0.3554 -0.0989 0.8559 281 | -0.4637 1.6717 -1.2414 1.0868 282 | -0.9791 -1.7058 1.9911 0.8143 283 | -0.8466 1.0339 -0.8416 3.6529 284 | -0.4185 -2.7288 3.3184 1.0349 285 | -2.1830 -1.4983 0.6337 3.0467 286 | -0.7861 -1.2050 1.8298 -1.1786 287 | -0.4931 0.3930 1.0190 -1.9413 288 | 2.3745 -1.2148 -2.2374 -2.0032 289 | -0.7766 0.3539 0.7056 3.3941 290 | 0.7520 1.1411 -3.5537 -2.8989 291 | 0.4115 0.3511 -0.6407 -2.9194 292 | 1.7353 -2.2867 -0.0580 -1.7502 293 | 0.4792 1.3989 -1.5811 -0.5186 294 | 0.2012 -2.3503 2.5158 1.1857 295 | -2.5446 -0.0227 3.0542 4.0142 296 | 1.4469 -0.8216 -0.0727 0.1570 297 | -2.9472 -0.0460 3.1429 3.3880 298 | 1.0161 -0.6344 0.8642 -2.5803 299 | -1.0139 -1.4754 4.7075 1.2065 300 | -0.4244 0.7052 -1.0493 -0.2121 301 | -2.3763 -3.1230 4.5055 3.4154 302 | -------------------------------------------------------------------------------- /data/linear_1.txt: -------------------------------------------------------------------------------- 1 | X1 X2 X3 X4 2 | -1.0900 0.7020 -1.0010 0.6305 3 | 0.9753 -0.0074 1.0761 -2.3750 4 | -0.0716 1.1252 0.1680 -0.7399 5 | -1.2083 1.9245 -2.0682 0.2759 6 | -0.1174 -0.1847 1.2259 -0.2650 7 | 2.2218 -4.8443 3.4895 -0.8565 8 | -0.2089 1.4192 0.3197 1.5023 9 | 0.5006 -0.2772 2.0967 -1.9816 10 | -1.2852 0.0731 -0.8476 1.6791 11 | 1.8722 -2.4401 4.1977 -4.2063 12 | 0.8941 -2.6381 1.4830 -0.0194 13 | 0.0120 0.8654 -1.3861 0.7360 14 | -0.2562 0.4400 -1.6554 0.0011 15 | -1.3587 1.8398 -1.8499 1.1080 16 | 2.2535 -2.3406 2.1120 -4.1602 17 | 1.6085 -2.0604 -0.4677 4.5905 18 | -1.8228 0.9803 -1.6191 -0.2597 19 | -0.5865 2.0967 -0.7598 -1.2009 20 | 0.9383 -0.6263 -0.2915 -1.1051 21 | -0.8576 0.6174 -1.0390 3.1661 22 | -1.5083 1.3886 -1.2546 4.3234 23 | -0.5386 1.0624 -0.1146 1.5156 24 | -0.7423 1.8258 0.8727 -0.4086 25 | 1.3512 -1.4684 0.8017 -0.8902 26 | -1.5792 0.8155 -2.2616 1.7818 27 | -1.8223 0.8485 -1.0058 -0.2161 28 | 0.2293 -1.0893 1.7045 -1.6349 29 | 0.3030 -0.8952 -1.9097 1.2845 30 | 2.5463 -3.6556 2.8598 -3.7812 31 | 0.4202 -0.4327 -1.1161 0.5072 32 | 0.7027 0.7484 -0.7606 2.6566 33 | 1.0784 -1.5652 -0.6119 0.8388 34 | 1.6851 -0.9671 2.2597 -2.4144 35 | -2.1494 0.5791 1.5277 -2.2873 36 | -1.4420 -0.0181 2.2233 -3.0601 37 | 0.9623 -2.3638 3.3956 -1.1979 38 | -1.1958 1.5628 -2.0653 3.9522 39 | -2.0945 2.7584 -2.4518 3.4959 40 | 2.4230 -3.8863 2.2600 0.0676 41 | -3.1434 3.1654 -3.6987 2.6862 42 | 1.1528 -1.3366 1.7751 -0.9773 43 | 0.5044 -0.5288 -0.1883 4.7662 44 | 0.1268 0.3990 -1.8133 -3.0767 45 | 0.7961 1.0280 -1.6378 1.7308 46 | 0.1113 -0.5718 1.8345 -1.2475 47 | -2.9021 1.8964 -1.6401 2.5649 48 | 0.2253 -0.8614 -0.8772 -0.6159 49 | 2.4881 -3.2648 0.9078 -3.6011 50 | -2.2131 2.5043 -1.1844 1.8573 51 | -2.5469 4.3247 -2.9273 3.6801 52 | -0.3303 0.2663 -1.4422 1.6375 53 | 0.1301 -1.0919 -0.1882 1.2558 54 | 0.5932 -0.3746 0.4301 1.3789 55 | -0.4480 0.7237 -0.1688 -3.2781 56 | 1.1805 -1.6336 -1.1342 0.1449 57 | -5.7348 8.9318 -4.7774 3.2962 58 | 0.9855 -0.4985 0.3980 0.3797 59 | 2.6338 -3.3890 1.2142 -0.9318 60 | 1.7410 -1.0574 1.3531 -0.3637 61 | 0.5888 0.9060 -3.1398 1.3542 62 | -0.7004 0.8317 0.1258 1.7372 63 | -0.8239 1.3903 -1.8308 2.5732 64 | -2.8089 4.0356 -4.0486 4.4886 65 | -2.6094 4.1331 -3.1082 4.2127 66 | -3.5301 3.7922 -1.2244 -0.0760 67 | 2.3613 -1.9740 3.3404 -2.5997 68 | -5.2289 6.0495 -5.4062 2.8838 69 | 2.0040 -2.1515 3.5530 -1.3269 70 | 0.6377 -0.5926 1.3743 -2.2304 71 | 0.2704 -2.2372 1.4017 -2.4200 72 | 2.2817 -3.3915 2.4688 0.6209 73 | -0.3039 1.7541 0.2298 -2.2415 74 | -2.6792 3.8673 -2.6817 1.2021 75 | 0.0252 1.0187 0.0540 1.8806 76 | -1.0506 1.4432 0.2670 -1.6632 77 | -0.9783 1.7853 -0.8810 0.0840 78 | 2.9202 -6.2215 5.0290 -4.7955 79 | 0.4967 0.1130 -1.4306 4.5718 80 | -2.9547 5.0248 -3.8556 1.2752 81 | 0.0265 0.0224 -1.6073 -0.6677 82 | -0.7528 3.2199 -2.1427 4.6341 83 | 0.1364 -0.3022 0.2002 -1.1353 84 | -1.1327 1.1132 -0.1359 1.7400 85 | -2.1907 5.6550 -4.3916 4.8390 86 | -0.7128 -1.0623 0.6621 -0.2906 87 | -0.3692 1.4041 -3.3047 0.1088 88 | -2.2932 3.8821 -2.6718 1.0170 89 | -1.8851 0.2791 -1.4475 3.7933 90 | 1.5718 -0.9038 0.9818 -0.3332 91 | -1.0513 0.1418 0.1523 0.8604 92 | -0.6382 -0.6193 1.3287 -3.1650 93 | -1.4796 2.0304 -0.0091 -1.1158 94 | -3.2332 5.1954 -5.1936 5.6137 95 | 1.3012 -1.0980 1.3970 -0.0947 96 | 0.0229 0.9881 -1.1116 1.9801 97 | 2.3690 -1.1990 0.2022 0.2596 98 | 0.9074 -2.0274 3.9905 -4.5246 99 | -0.6015 0.4815 0.1291 0.3774 100 | 1.2448 -1.7587 1.4784 -2.1623 101 | -2.1992 2.3278 -0.4120 1.4942 102 | 1.1530 -2.2928 2.4347 -0.9512 103 | -0.6984 1.3583 -0.7819 1.9138 104 | -1.4287 4.0516 -1.8757 1.1006 105 | -1.4580 4.0475 -1.9301 2.0246 106 | -1.0540 0.6494 -2.1668 0.5312 107 | 0.8221 -3.0685 1.6854 -0.2097 108 | 1.6921 -0.7993 -1.4755 -1.4381 109 | -1.9909 2.3811 -2.7287 -0.7869 110 | 2.0726 -2.7053 1.7090 -4.0177 111 | -2.6480 4.3123 -2.8561 -0.1372 112 | 0.5074 -0.5903 2.2619 0.3193 113 | 1.6545 -3.5199 0.2476 -0.4944 114 | -1.0355 0.8410 -2.1648 -1.2698 115 | 2.5394 -3.4784 -0.1098 0.2000 116 | 3.5382 -6.6119 4.9756 -4.6727 117 | 3.7158 -6.2100 4.0908 -4.3217 118 | 0.3725 -0.3199 -1.8884 1.3470 119 | -1.2840 0.5753 -0.0107 0.0809 120 | -1.2358 3.2912 -1.5626 2.0321 121 | 0.2544 -0.5628 1.6012 1.6727 122 | 1.3222 0.3004 -0.4623 0.9082 123 | -3.4456 2.9455 -4.8205 2.9581 124 | 0.4833 0.9948 0.8167 -0.1030 125 | -0.4469 0.4463 2.0501 -0.8238 126 | 0.7607 0.0655 -1.8798 2.5602 127 | -2.4234 1.3072 -2.5409 0.4427 128 | 2.9850 -5.2064 2.2033 0.3741 129 | 1.0162 -0.9714 0.4169 1.0843 130 | 0.2099 -0.2891 1.4305 2.0278 131 | 0.1224 -1.7624 -0.8701 0.2907 132 | -1.9964 5.3981 -2.2138 0.8448 133 | 1.1217 -3.1691 2.5213 -3.1642 134 | -3.0153 3.9632 -2.2729 2.3591 135 | -1.8858 2.6231 0.1735 -1.3379 136 | -2.4615 1.4408 -1.7808 3.5102 137 | 1.0506 -0.9322 -0.1302 -2.9468 138 | -3.5234 4.9808 -0.3089 0.0258 139 | -0.2247 -1.6653 -0.5595 0.3912 140 | -3.9930 4.8227 -2.5771 2.7147 141 | -4.6587 5.8361 -3.4477 0.1261 142 | 0.8946 -2.2407 0.6980 -1.0153 143 | 0.9893 1.0781 -1.3372 2.1530 144 | 1.7438 -1.2918 1.9945 -1.3344 145 | -1.2155 3.6731 -3.7130 -0.4757 146 | -2.3642 3.8972 -4.1603 1.9331 147 | -1.9872 1.9445 -1.4156 -0.1221 148 | -1.3008 3.5923 -3.5751 0.4944 149 | 1.7242 -3.1833 1.3732 0.2472 150 | 0.6183 -0.4379 0.3346 -0.1718 151 | -0.5472 1.7678 -0.4433 -0.2038 152 | 1.1722 -1.0002 1.0738 -0.8567 153 | 2.2836 -1.0116 2.0051 -3.6734 154 | 0.7720 0.1557 -0.6488 3.2384 155 | 1.9198 -1.4280 -0.8870 2.4429 156 | -1.4364 0.4043 1.1115 0.1074 157 | -2.4727 5.3127 -2.2432 2.7069 158 | -1.1611 2.6512 -0.0119 2.8549 159 | -0.4212 0.3691 -1.0256 -1.7569 160 | 0.2058 0.1710 0.0044 -0.2015 161 | -2.1783 4.7534 -2.6275 1.6468 162 | 6.7077 -8.5984 5.8192 -3.2625 163 | 0.9011 -0.7036 1.1274 -1.6322 164 | -1.9057 1.1766 0.9641 1.4560 165 | 1.1679 -2.7600 1.4512 -2.2898 166 | 1.7802 -2.2335 1.7346 -0.8743 167 | -0.8994 0.6712 0.1166 -0.7219 168 | 2.5067 -3.8387 3.2250 -5.0992 169 | 0.2993 -1.2147 1.8962 -0.4666 170 | 2.0035 -3.7196 3.8175 -1.2268 171 | 0.4705 -1.0300 0.8779 -3.2260 172 | 0.7338 1.9469 1.9910 -2.4116 173 | 0.4932 -1.3459 1.3936 0.0645 174 | 0.3452 -0.8638 1.0184 -0.6732 175 | -1.1385 0.3247 -2.7951 1.2168 176 | -2.2179 2.1718 0.3669 0.8148 177 | 0.8757 1.1161 0.9324 -1.8629 178 | 1.0861 -2.2711 0.5488 1.7941 179 | 1.2754 0.4958 0.9060 -2.0120 180 | 4.2121 -6.2745 6.5894 -1.4398 181 | 1.6648 -1.5243 0.4118 -1.6482 182 | -1.0071 0.2391 1.6285 -2.6830 183 | 0.0481 -0.5188 0.2764 0.5032 184 | 3.7995 -5.6557 2.7990 0.0031 185 | -0.5356 1.3553 -1.4123 1.1974 186 | -0.6964 0.7849 0.0793 -0.4092 187 | -1.1570 -0.4206 0.2682 -0.4910 188 | -0.5467 1.7940 -3.3012 1.7345 189 | 0.6126 -0.1582 0.9827 -0.1947 190 | 0.9807 -0.7914 0.9984 -1.9384 191 | 2.0600 -2.7681 2.8354 1.1211 192 | 1.5654 -2.7455 -0.4810 0.9567 193 | -1.6577 -0.9398 3.0806 -1.5181 194 | -1.5775 1.6468 -1.1509 0.1303 195 | 0.0312 -0.6440 1.2859 -0.7424 196 | -1.7438 2.9344 -5.2466 2.6752 197 | 1.3552 0.0707 -1.0004 -0.2062 198 | 2.3020 -2.8418 4.1448 -6.8893 199 | -1.0886 2.2666 -1.2338 -1.1473 200 | 0.1311 0.0016 -0.7682 0.9510 201 | -4.7298 5.4501 -5.2314 3.8043 202 | -1.4416 2.8645 -1.0849 1.2636 203 | 2.4353 -6.6893 2.9965 -3.4684 204 | 1.6311 -3.7167 4.5294 -4.6049 205 | 0.7129 0.3790 -0.5915 -0.9539 206 | 0.9853 -1.1985 -0.4103 0.1647 207 | -0.2463 0.1348 0.3997 -1.8167 208 | 2.4677 -4.1649 3.6247 -4.5539 209 | -3.1433 2.2769 -1.4351 2.2472 210 | -0.5997 0.7878 -0.7083 3.3493 211 | -0.2219 2.9956 -3.2567 3.3879 212 | 3.4457 -4.5597 4.4612 -2.6982 213 | -0.9987 0.3857 -1.3589 0.8286 214 | -2.3675 4.6713 -3.4630 2.4612 215 | -0.3782 0.2420 2.8704 -1.0199 216 | -1.7842 2.9929 -0.4335 0.1881 217 | -3.5330 4.3402 -2.4082 -1.7555 218 | 0.7279 -0.9461 0.2986 1.5253 219 | -1.0857 4.0381 -1.1630 1.5600 220 | 1.7275 -1.7774 -0.3628 -0.6869 221 | 1.5493 -1.0240 -0.4974 -0.8631 222 | 0.5943 1.0869 -0.9582 1.5274 223 | 2.8690 -3.2563 3.3611 -1.4471 224 | 2.9257 -3.0525 2.4868 -2.7332 225 | 0.4027 -3.5227 3.5266 -0.8499 226 | 3.3916 -4.9978 3.5416 -1.4827 227 | -1.6987 3.0726 -1.3319 1.7633 228 | -1.5557 3.4142 -2.8666 1.5640 229 | -0.8027 -0.0695 -1.5131 -0.9153 230 | 0.0736 -0.7860 1.5578 -0.9551 231 | -0.4279 2.2720 -0.2011 -2.0304 232 | 1.4023 -1.8293 1.3506 -0.4297 233 | -2.7573 2.6795 -3.9001 4.2465 234 | -0.4203 0.9734 -1.9729 -1.8064 235 | -1.2864 1.6348 0.8188 -0.4216 236 | -1.7385 2.0098 -0.9753 -0.0532 237 | -2.2093 3.8695 -1.1137 1.4301 238 | 0.8066 -1.2087 0.2463 1.3244 239 | -1.2140 -0.2062 -1.0578 0.1600 240 | -0.6960 0.7994 0.4188 -2.1940 241 | 1.9200 -2.6634 3.0670 -3.0305 242 | 2.0592 -4.0635 4.5978 -1.3770 243 | 2.6652 -3.7128 3.3657 -1.5910 244 | -1.6422 2.4859 -1.9821 4.0544 245 | 1.1868 -1.3394 0.8355 1.0453 246 | 0.6707 0.0650 -1.6489 -1.5324 247 | 0.0346 1.7347 -2.8984 2.5162 248 | -0.4212 0.0139 -0.0464 -1.7907 249 | 2.0278 -2.7720 1.8203 -1.7754 250 | -2.1878 2.7984 -3.7490 3.2679 251 | 0.8070 -1.3033 0.0881 -1.8347 252 | -0.1077 -1.9024 1.7961 0.5247 253 | 2.1591 -4.9335 6.6325 -5.5053 254 | -0.0300 -1.6648 1.8453 -2.5844 255 | -3.3999 4.8242 -2.1158 1.7990 256 | 0.1480 -1.5725 0.8437 -2.6698 257 | 1.9823 -3.1753 1.5576 -1.1294 258 | 2.6089 -4.1521 3.4486 1.7335 259 | -5.2560 6.6287 -5.6363 7.8463 260 | 0.3536 -0.5571 -0.9817 -1.2550 261 | -0.8702 1.7194 0.8097 -1.0582 262 | -3.6449 4.7141 -2.4439 -0.1028 263 | 2.5143 -3.3446 1.2600 -4.8624 264 | 1.2735 -2.2038 2.8952 -3.3995 265 | -1.2572 -0.9776 -0.0843 0.8693 266 | 3.8312 -5.7975 2.6337 -1.9688 267 | 0.6265 -1.7849 2.2480 -2.5622 268 | 0.6790 -1.1334 0.1967 -0.6159 269 | 0.1081 1.3010 -3.5990 1.0454 270 | 2.1146 -0.9540 2.0404 -1.6243 271 | 0.0365 -0.6352 -0.7213 -2.6919 272 | -0.4249 0.3460 0.9868 -0.4075 273 | -0.2214 1.3200 -0.3962 -1.9658 274 | -0.1918 -0.9431 1.4964 1.6336 275 | 1.6507 -1.0985 0.5365 -1.1206 276 | 2.1983 -3.1178 1.4616 -3.5599 277 | -1.7563 3.2385 -3.6326 3.0152 278 | -1.8454 1.1570 -0.7387 -0.3827 279 | 1.3343 -2.6883 2.7234 -1.6175 280 | 3.0179 -4.8692 2.9028 -5.2544 281 | 0.2580 -1.1953 -0.9440 0.1418 282 | 2.1201 -2.4369 -0.0939 -1.0381 283 | -1.0192 1.7210 0.1855 -1.5238 284 | 1.1887 -1.0719 0.7239 1.0624 285 | 2.0584 -3.2305 0.9409 0.0083 286 | -0.4827 0.0737 -0.5072 3.0439 287 | 1.1285 -0.9235 1.3424 -2.1210 288 | 0.9092 -1.0489 -0.6473 2.4011 289 | -3.2417 2.5092 0.4515 1.4229 290 | 2.4782 -5.4602 1.2755 -0.0098 291 | -1.3435 3.4335 -3.9148 0.1571 292 | -1.1343 3.5711 -0.3768 -2.2037 293 | 2.0794 -3.1259 -0.0804 1.2884 294 | 1.7978 -2.5039 2.7636 -4.1771 295 | 2.2550 -3.7133 3.2286 -3.1313 296 | 0.9811 -0.9379 1.8958 -2.1474 297 | 2.6543 -2.8884 2.5257 2.8585 298 | -0.8480 1.8336 -0.0115 3.5895 299 | -4.2669 5.3205 -2.9371 3.5122 300 | -0.5032 -1.2847 1.9429 -4.9289 301 | -0.3978 -0.2867 -0.4268 -0.7667 302 | 1.0185 -1.4342 -0.3521 3.9628 303 | 1.4247 -2.8679 0.0886 -3.6574 304 | 1.9571 -3.7417 2.4144 -4.1091 305 | 3.4760 -5.0955 5.2131 -2.0376 306 | 2.4234 -5.5613 4.6510 -1.8474 307 | 0.7347 0.1590 1.4726 -1.6465 308 | 0.8615 -1.4356 0.7517 -1.0305 309 | -1.6648 0.6204 0.3582 -0.9059 310 | -2.6102 3.9292 -5.3447 4.0920 311 | 0.0467 1.3368 -2.4983 1.4298 312 | 0.9549 -0.8607 1.1120 -1.1449 313 | -0.9611 1.4355 -0.3609 1.5203 314 | -0.0266 -0.6147 0.7583 0.6576 315 | 2.2399 -2.7874 0.3019 0.1396 316 | 0.6104 0.7339 -1.7352 0.4178 317 | 1.2434 -0.7044 1.4070 0.3888 318 | 1.0704 -2.3040 0.3654 1.5041 319 | -0.4596 0.2533 -3.3432 1.1173 320 | -0.0919 -1.0365 0.2518 0.4114 321 | -0.5351 1.0634 -2.2042 5.0104 322 | -2.5041 1.1629 2.5200 -0.6230 323 | 0.1299 1.9460 -1.8787 1.6544 324 | -1.2547 3.9004 -4.3475 2.1884 325 | -1.3814 2.1247 -2.0662 0.2821 326 | 1.5703 -1.2382 0.8177 -2.1443 327 | 0.3177 -0.3730 0.1167 -1.8618 328 | -0.7143 1.6336 -1.0752 1.2229 329 | 1.1660 -3.6279 3.1018 -2.1935 330 | -1.5572 3.5015 0.4779 -0.3391 331 | 2.5459 -2.2746 2.1049 0.3450 332 | 2.1769 -3.0118 3.2306 -2.0353 333 | 2.2460 -3.6307 5.5391 -5.0131 334 | -2.2455 1.0986 1.7277 0.8886 335 | 0.6324 -0.9586 0.1012 2.9919 336 | 1.0406 -1.5155 0.9363 0.2473 337 | -2.8578 3.4910 -0.2807 2.5223 338 | -1.0803 -0.2591 0.2334 -1.1981 339 | 0.4759 1.0451 -0.8835 -1.3310 340 | -0.4207 2.2075 -2.1733 -0.0340 341 | 2.7382 -4.7871 2.8121 -3.6069 342 | -3.5719 4.6522 -3.3314 1.8769 343 | 1.4440 1.4395 0.6249 -0.5312 344 | 1.0012 -2.3027 1.3425 0.5070 345 | 1.2121 -1.9153 2.2605 -1.8846 346 | -0.3512 0.4190 0.1697 0.3158 347 | 2.9283 -2.3514 1.8289 -0.6127 348 | 0.5468 -2.3691 1.2139 -1.7248 349 | -2.7752 2.6966 -1.2113 3.3508 350 | 1.3038 -1.0569 0.9502 -1.5312 351 | -1.0035 1.5317 -4.9867 4.0461 352 | 1.6253 -2.3069 1.6264 -1.9175 353 | 1.0680 0.7962 -2.8005 2.5356 354 | 0.3356 1.6983 -1.0563 3.5371 355 | 1.3422 -2.2305 1.2191 0.2855 356 | -0.3273 -1.9245 0.0748 1.8252 357 | 0.1452 -0.6099 1.3791 -1.1909 358 | -1.4478 3.0632 -1.8047 -0.5578 359 | 0.8176 -0.8639 -2.1298 0.2753 360 | -1.2815 0.0003 1.5293 -2.8635 361 | 1.0604 -3.6932 3.7445 0.2880 362 | 0.1834 -0.6681 1.2316 0.9439 363 | -3.0338 4.2248 -3.3083 1.4648 364 | 3.2925 -4.5650 3.4848 -3.1683 365 | 2.4240 -0.7751 -0.1248 -2.0080 366 | -0.9575 -0.8490 0.7004 0.6302 367 | -0.7525 -0.8206 1.6034 -0.2371 368 | 3.1474 -5.7806 3.8650 -1.6480 369 | -1.1947 2.2771 -0.8035 -0.7070 370 | -2.0065 2.3593 -0.0920 1.6741 371 | 1.3797 -4.2628 3.6040 -0.3309 372 | 0.6721 0.0390 -0.8996 1.9658 373 | -1.6735 2.0734 -1.2047 -0.0968 374 | 1.4036 -1.6025 0.7370 -2.4138 375 | 0.3113 -0.0068 1.9862 -1.6741 376 | -1.8215 2.5950 -0.0463 -3.0314 377 | 0.9610 -0.1231 -0.0929 -2.2761 378 | -0.4296 2.1091 -1.3728 -0.8612 379 | -0.4915 -0.1205 -0.6505 0.4613 380 | 1.7835 -3.3021 4.1038 -5.6244 381 | -0.5010 -0.1385 -0.4778 1.0001 382 | 2.3473 -4.5291 2.3209 -2.6532 383 | 0.4503 -1.2951 1.6791 0.5772 384 | -2.1868 2.4629 -1.0664 -0.7359 385 | -2.1028 2.3250 -4.4700 3.5411 386 | -2.7144 4.7650 -2.1897 2.7530 387 | -0.0413 0.5473 -1.5077 3.2899 388 | -0.5073 0.0286 -0.9097 1.0293 389 | -0.3151 0.0564 1.5943 -3.5562 390 | 1.9832 -4.3670 1.6846 -0.5051 391 | -0.1265 -0.2920 0.4359 -2.3394 392 | -1.6708 1.8447 -0.5476 -1.6043 393 | 0.9820 -0.9190 -1.8713 4.3085 394 | -0.4160 -0.2254 -1.6642 -0.2492 395 | -0.3266 0.4575 0.8529 1.9110 396 | -0.8633 1.1502 -3.5805 1.2594 397 | 0.8169 -1.5419 1.7886 -1.6153 398 | -1.8050 -0.4300 0.3783 -0.3982 399 | -2.6035 3.1410 -1.1079 -1.8392 400 | 1.3200 -1.5188 0.2214 2.6136 401 | 0.5824 -1.0258 1.8195 -0.7269 402 | -1.9800 2.8568 -2.5627 2.1322 403 | 1.5593 -3.2141 3.9718 -2.3569 404 | 0.6032 2.0693 -1.6617 -0.6860 405 | -1.1488 -0.3849 -0.3694 -0.4872 406 | 0.9376 -0.4751 -1.2248 1.8626 407 | -1.5874 2.2718 0.1958 0.5979 408 | -1.9156 3.3890 -1.0979 -2.1727 409 | 2.4691 -4.2285 1.8238 -2.6738 410 | 0.0166 -0.6289 -1.6618 1.8493 411 | -0.8073 1.8931 -2.3469 -0.2570 412 | 1.3514 -1.1593 0.6891 -0.5524 413 | 1.1358 -2.2162 0.8506 -1.2774 414 | 3.0605 -6.0286 3.9440 -1.4995 415 | 0.9090 -0.4415 0.2407 1.7577 416 | -0.6603 2.0587 -1.8735 3.0799 417 | 0.9248 0.3771 1.8815 1.6127 418 | -1.7751 4.0731 -1.4415 3.3666 419 | 1.2626 -0.5517 -0.0148 -1.5493 420 | 0.7294 -1.5001 5.3080 -4.0655 421 | 1.5125 -1.4047 -1.5979 0.8999 422 | -1.0162 0.4780 0.8544 -0.6338 423 | 1.4069 -0.9963 0.5220 -1.0498 424 | 0.0706 -0.7243 -1.2136 0.6513 425 | 0.0118 1.7826 0.5564 -1.0101 426 | -0.4757 -0.3423 -0.8140 -1.2068 427 | -1.3822 0.2538 2.4522 -2.1863 428 | 0.0792 0.4009 1.2876 0.2220 429 | -3.3938 5.1413 -5.4668 2.1053 430 | 1.1362 -0.1089 -0.2805 -1.0752 431 | -0.9984 0.8605 -0.3897 0.7427 432 | 0.4009 -1.2165 -1.6150 2.8729 433 | -2.4979 3.0966 -1.1048 2.7158 434 | -2.4306 4.7759 -2.5495 0.9799 435 | 2.1501 -2.2842 2.1717 -2.1504 436 | -1.1137 2.3072 -0.9840 2.4801 437 | -1.0093 3.1891 -1.6972 1.8972 438 | 1.0123 -1.2481 2.2432 -4.2394 439 | 0.5678 -1.9080 0.4957 -1.9011 440 | -1.1475 2.0122 -1.6535 0.1492 441 | 1.6208 -2.1496 1.0100 -0.4237 442 | 1.6926 -1.6242 -0.8967 1.3610 443 | -0.8179 1.5342 -1.4107 2.6162 444 | 0.9114 0.0543 0.9264 2.4302 445 | -1.6727 2.8283 -1.4601 0.9702 446 | 0.2734 -0.8439 2.1470 -0.6261 447 | 0.0443 -0.3582 1.7375 -1.2375 448 | -1.8790 4.2280 -3.4589 1.4625 449 | 1.0886 -0.8534 -0.2343 -2.0556 450 | -0.7961 -1.4788 -0.0393 -2.5669 451 | 2.6049 -3.7579 2.8162 -1.7324 452 | -0.9983 1.6051 -1.7941 0.2679 453 | 1.8902 -2.1899 2.1966 -1.3463 454 | -3.4214 3.6293 -2.6913 3.4523 455 | 1.7781 -1.6748 1.2039 -0.9991 456 | -2.9451 3.5319 -2.4987 -0.7302 457 | 0.9390 -1.4322 1.8525 -2.8930 458 | -0.1423 0.3619 2.1269 -3.7712 459 | -0.9506 2.0603 -0.8798 0.8810 460 | -0.6649 1.7907 -0.2783 2.7082 461 | 0.8345 -1.4114 -1.5451 -1.1841 462 | 0.8416 0.0118 -1.6991 2.5737 463 | 0.2610 0.6620 1.5284 -0.4309 464 | 0.6651 -3.4939 0.9922 -2.5448 465 | 1.9326 -3.9649 2.3591 -1.5438 466 | -0.4032 2.0720 -2.1272 0.6975 467 | 1.2733 -2.4220 1.9593 -2.4888 468 | -2.1227 2.7953 -1.4768 3.5187 469 | 3.7303 -3.9749 1.8657 -0.3089 470 | -0.2127 0.2082 1.1049 -0.7540 471 | -0.1577 0.0742 1.4669 1.0705 472 | -1.0820 2.6280 -0.5105 -1.4076 473 | -0.3602 -0.9863 0.1732 -1.1650 474 | 1.0607 -0.6782 -0.3550 -1.7433 475 | 1.3560 -2.4044 4.0120 -3.8478 476 | -3.3162 3.7079 0.1314 -0.7974 477 | 0.8090 -0.6697 -1.3352 3.8430 478 | 0.7376 0.2161 -1.0504 0.9077 479 | -1.8278 2.4828 0.0569 1.9981 480 | -0.8607 1.5036 0.5660 -1.6403 481 | -1.0952 2.6776 -2.0192 -1.2558 482 | 0.7885 -0.3211 0.7815 1.7303 483 | -3.2768 5.5844 -4.4398 4.1887 484 | 0.6617 -1.7350 0.6209 -1.0745 485 | -2.2710 2.5003 -2.1394 1.5077 486 | -0.4693 0.4201 0.4471 -1.5821 487 | 0.7434 -2.5690 0.9093 -0.9086 488 | -1.4229 2.9913 -1.4544 0.4889 489 | -1.5150 1.8250 -3.4217 0.5995 490 | 1.8356 -1.1636 0.2673 3.3280 491 | -1.2275 1.7639 0.3961 0.8939 492 | 3.3563 -4.1276 2.3028 -1.4136 493 | 0.4958 0.3435 0.9711 -1.7145 494 | 1.9937 -2.5598 0.3268 -0.7499 495 | 1.5696 -3.0712 1.0593 -0.1477 496 | 0.6775 1.9679 1.0086 1.7171 497 | -1.3810 2.4189 -2.1483 -0.0203 498 | 0.4674 -0.9928 -0.3510 0.9079 499 | 1.9358 -3.3704 2.4630 0.0906 500 | 3.4962 -4.9384 1.5484 -1.9419 501 | -2.0586 3.9324 -5.3344 7.1554 502 | -0.4168 1.1571 -2.9138 1.2333 503 | 0.4311 0.3651 -0.0478 2.4457 504 | -1.4001 1.6733 -1.3277 -0.6301 505 | -0.5681 2.7337 -2.5014 1.1394 506 | -3.2774 6.3466 -4.5821 0.9299 507 | 1.4720 0.2139 -2.8939 1.5468 508 | 0.9113 -1.4944 0.7225 0.0178 509 | -2.6031 4.1277 -3.3743 3.1864 510 | -1.8454 3.5137 -4.3429 2.2706 511 | -2.4773 3.3929 -4.2474 3.8898 512 | 0.8567 -2.0278 2.2026 -2.5945 513 | 1.5364 -1.7663 1.9983 0.1438 514 | 0.2370 -1.0952 1.0202 0.6644 515 | -0.1614 0.5217 -2.7830 5.7433 516 | 2.3362 -3.2806 0.1642 0.2210 517 | -0.1898 -0.5339 -0.6074 0.0754 518 | -0.9003 0.2863 0.5400 -0.1403 519 | -0.0166 -1.1185 -0.3990 -1.3437 520 | 1.2560 -3.3147 2.9521 -3.7248 521 | 2.3244 -3.5451 0.7979 -0.2893 522 | -0.8779 0.0251 1.9283 -1.9232 523 | 1.9250 -2.1313 2.1332 -2.8456 524 | 1.7201 -3.2695 2.9131 -2.6163 525 | 0.7596 -0.2490 -1.2349 1.2033 526 | -1.5992 3.1100 0.1082 -3.0093 527 | -0.2541 0.9101 -3.9552 1.1286 528 | 0.7130 -2.8651 1.5903 1.0326 529 | 0.6766 -0.6547 -0.2474 0.3929 530 | -1.6432 3.9385 -1.0241 -0.2330 531 | -0.4408 -1.1395 2.6549 -1.7223 532 | -0.1071 0.6903 -1.6576 -0.5475 533 | -0.0114 -1.1852 0.9760 0.4618 534 | -0.3380 -0.5095 -0.2835 1.8059 535 | 0.8454 -1.1546 -0.4014 1.2588 536 | -0.2374 0.7670 -0.7263 1.6838 537 | 2.3567 -2.8675 1.4035 -0.0492 538 | -1.2768 1.2499 0.7270 -3.9904 539 | 3.3866 -4.4117 2.5137 1.5154 540 | -0.6374 2.0809 0.6960 -0.1506 541 | 2.1132 -2.8596 3.7121 0.6604 542 | -0.1725 -1.5758 1.0722 -1.9899 543 | -1.4375 1.3973 2.2079 -2.1502 544 | -1.3858 1.3237 0.5400 -0.6116 545 | -2.1444 2.9371 -2.8709 0.0533 546 | -1.4075 2.0908 -1.2895 2.4425 547 | 2.0539 -4.0151 4.4162 0.1400 548 | -1.5983 2.8727 -1.9664 1.7177 549 | 2.8714 -4.4406 2.2324 -5.6920 550 | 0.6608 -1.2968 0.4926 -1.3594 551 | 0.2265 1.2669 -2.7780 2.6726 552 | 0.1477 0.3428 -0.8948 -0.8485 553 | -2.4724 4.0512 -1.5994 1.7774 554 | -0.2730 -1.0163 1.4474 -3.5532 555 | 1.1559 -1.4453 0.5985 0.5235 556 | 0.4427 0.5535 1.1643 -2.7164 557 | 0.5666 -0.8211 1.0077 3.4879 558 | -0.0231 0.8827 -1.0617 -0.3651 559 | -0.7628 1.6556 -0.2797 -1.3479 560 | -1.9997 1.8147 -1.1891 2.4071 561 | -2.6363 3.6448 -3.3742 1.0443 562 | -1.3767 0.4313 -1.6227 1.3824 563 | 1.6429 -1.4162 -1.3247 -0.8525 564 | -1.3132 -0.2357 0.6538 -0.2497 565 | 0.4154 1.0370 -0.9801 3.5181 566 | -0.2566 -0.7893 -0.2257 2.7240 567 | -0.6877 1.4002 -2.9951 0.9035 568 | -0.0231 -1.7146 1.6151 -2.7442 569 | -1.0659 1.0261 -0.7140 -1.0691 570 | 1.5397 -1.7437 2.5044 -3.0546 571 | 4.2368 -4.9766 5.3573 -6.3826 572 | -1.2585 0.2122 0.3837 -1.2266 573 | 0.3982 -3.0785 2.3723 -3.2200 574 | 2.1463 -3.2685 3.2932 -1.8343 575 | -0.0647 -1.4213 -1.1823 0.9139 576 | 2.6447 -4.3465 2.3848 -3.9587 577 | -1.9526 4.9976 -1.6889 -0.5997 578 | 0.1990 0.0961 1.6128 0.4050 579 | 0.1764 -0.9440 0.1530 -2.0368 580 | -3.4204 4.9875 -2.8102 0.9009 581 | 1.9929 -4.4909 3.0770 -7.1560 582 | -1.2281 1.9378 -0.5286 -1.7820 583 | 2.2174 -3.8080 3.3064 -3.5737 584 | 1.2011 -2.4105 2.6499 -3.4340 585 | -0.8248 1.6551 -0.3054 0.5060 586 | 1.2722 -1.7053 3.6538 -1.1343 587 | -0.7326 1.1873 2.5334 -1.7431 588 | -1.9787 1.8636 -1.9374 2.6812 589 | -0.1082 -0.2865 1.3948 -0.8663 590 | 2.8458 -2.3345 -0.5997 0.3648 591 | -0.1704 -1.4838 0.2094 0.8450 592 | 0.9409 -0.8251 2.1245 -2.3654 593 | -3.5908 5.2481 -4.4655 3.2330 594 | 0.0430 0.5639 1.1362 -0.6020 595 | -0.6883 2.0468 -1.6201 4.7797 596 | -1.1626 0.4387 -0.9056 0.7308 597 | 1.0973 -1.2028 0.3617 -0.9746 598 | -1.0538 4.0708 -4.3558 4.9951 599 | -1.6591 3.2622 -0.9648 0.1864 600 | 0.1235 -0.8777 2.9949 -0.7093 601 | -0.9435 1.1575 -1.4956 0.9932 602 | -0.3312 4.0587 -3.1710 3.1142 603 | 1.0668 0.0938 -0.6088 0.8947 604 | 1.2272 -0.2389 -0.9800 2.2638 605 | 1.2629 -1.5627 0.1846 0.7614 606 | 0.1628 -0.3513 0.2389 -2.0619 607 | -1.1090 0.7156 -0.5224 -1.1571 608 | 4.0992 -7.4618 4.6826 -7.0377 609 | 0.6436 -1.5257 1.0065 2.4243 610 | -0.2089 1.5767 0.8713 0.8575 611 | -1.2635 1.8723 -3.8154 3.0404 612 | 3.5878 -4.7729 2.3068 -1.0712 613 | -0.2301 0.2900 -1.4258 2.4218 614 | 1.1029 -1.9623 1.8677 -0.0401 615 | -0.4229 -0.9332 1.0056 -3.3888 616 | -0.0726 -0.5524 2.1742 -3.3476 617 | 1.0923 -0.9266 0.6573 0.9386 618 | 0.9944 1.1793 -0.6315 -1.6044 619 | -0.3975 1.1411 -0.5557 -1.7210 620 | -2.6711 2.2818 -2.9216 0.0625 621 | 1.7141 -1.7526 2.1493 -0.3793 622 | -0.1717 -0.1260 -3.4244 0.1543 623 | 1.4601 -1.4186 0.5472 -1.2244 624 | 3.1626 -4.3679 5.0693 -5.3153 625 | 1.4400 -2.1011 1.3476 -2.4058 626 | -0.2190 1.6387 -2.2434 5.9233 627 | -2.1115 2.1260 -4.4432 1.1573 628 | -4.1488 6.8225 -5.0869 5.0017 629 | 1.4245 -0.8541 0.7167 0.5784 630 | 4.8551 -6.1749 4.6590 -3.9562 631 | -0.0708 1.7503 -2.3181 4.9543 632 | 2.1805 -1.9256 2.7581 -1.9166 633 | 3.2436 -2.6140 1.6178 -0.8281 634 | -2.1353 3.1085 -1.3678 1.5000 635 | 0.3014 -1.5068 -0.2148 1.0061 636 | 0.4264 0.3321 1.8270 -2.9679 637 | -0.3524 0.2858 0.6507 -0.0002 638 | -0.2313 -0.8263 -0.6248 0.6938 639 | 1.8945 -3.3462 4.6625 -2.2109 640 | 0.5801 1.6233 -2.0298 4.1418 641 | 1.0208 -0.8429 -1.4348 -0.8033 642 | 0.1698 1.2046 -0.6420 2.6247 643 | 1.1166 -0.5799 1.6047 -1.8165 644 | -2.4276 1.6753 -2.2009 2.1769 645 | -0.4621 -0.8289 1.3050 -1.1801 646 | 1.1003 -0.7507 0.6983 3.8407 647 | -2.9348 1.4070 0.9557 1.5990 648 | -1.2595 2.5839 -0.0906 -1.4529 649 | -1.4302 1.4269 -4.0040 -0.3571 650 | 3.8791 -4.1095 3.8168 -6.2184 651 | 0.1025 1.3120 -1.8457 2.8259 652 | -0.7135 1.9147 -1.7530 1.4849 653 | -0.8661 0.7347 0.0848 -0.3501 654 | 2.0070 -1.9013 1.2305 -0.1666 655 | 0.2362 0.6444 2.0550 -2.8106 656 | -0.2277 0.3485 -0.3205 -0.4129 657 | 0.3093 -0.7866 0.0744 0.3211 658 | -1.2844 1.5033 0.7932 -0.2718 659 | 0.2397 -2.4954 1.2031 -0.7917 660 | 0.1087 0.2118 -0.9795 0.1218 661 | -0.2526 1.9954 0.5358 1.5486 662 | 0.6327 -0.7370 1.0742 -4.9349 663 | -0.3905 0.3449 -0.6705 3.4781 664 | 2.0921 -3.9816 3.1537 -2.6303 665 | 1.9001 -2.6302 4.4552 -5.2211 666 | -0.1103 -0.0216 0.1779 1.5178 667 | -0.6161 3.4602 -3.7431 -0.4778 668 | 1.7957 -2.3945 1.8503 -2.3394 669 | -0.4459 -1.4958 2.4628 1.0894 670 | 0.1516 1.6539 -3.4505 3.7447 671 | -0.4750 1.6043 -3.2748 2.3154 672 | -1.5244 3.2309 -0.8765 1.6157 673 | 1.8608 -6.9307 5.8139 -6.6464 674 | -0.0927 0.2326 -2.5053 1.1516 675 | -1.4494 2.6426 -0.2491 2.3426 676 | 3.5468 -4.4077 4.6819 -3.4005 677 | 0.5225 0.0873 -0.2371 -2.7413 678 | 1.7357 -2.3195 1.6259 -2.2460 679 | 1.4716 -1.9525 -0.8040 -0.7493 680 | 0.2971 -0.9877 0.3670 -1.2802 681 | -1.9396 1.0106 -0.2404 -1.1892 682 | 1.0997 1.0403 -2.3510 3.8877 683 | -0.2247 -1.1363 0.3188 1.6240 684 | 0.8247 -1.0204 -0.5899 1.7700 685 | -1.8540 1.5840 -3.2960 0.1129 686 | -1.4198 0.6306 -1.2670 0.8721 687 | -1.7310 2.4145 -3.1544 2.2940 688 | -0.8353 1.6364 -2.7729 2.6443 689 | -0.2897 0.6140 -2.1460 -0.7876 690 | 0.7914 -2.7810 1.4900 -1.1980 691 | -4.1019 5.9892 -6.8134 4.2138 692 | -0.5339 1.0234 0.1425 -0.5136 693 | 1.3446 -1.8769 0.7677 -0.8951 694 | -0.9499 3.1184 -0.7719 -1.2147 695 | -1.1475 2.6028 -2.3317 1.1433 696 | -0.2062 -1.1469 3.4937 -1.9062 697 | 0.2772 0.6020 -2.6937 0.2347 698 | 3.4986 -5.5072 4.3739 -1.6358 699 | 0.2941 0.5346 0.4540 0.4593 700 | -0.1242 -1.0397 -0.6652 -0.9404 701 | 0.5710 -0.7745 -0.2705 1.0908 702 | -0.4038 -1.0506 -0.0250 0.2840 703 | 1.2326 -1.1179 0.6415 3.3723 704 | 0.4547 1.6919 -1.9841 -0.7070 705 | -0.1828 -1.7248 1.8417 -4.3951 706 | -1.3410 2.7061 0.0560 0.3357 707 | -0.7204 0.2881 -0.2452 1.7364 708 | 0.1451 1.2196 -0.8318 0.3855 709 | 1.2599 0.0647 0.0332 0.5144 710 | -0.0635 1.6113 -1.4286 2.2698 711 | -0.8989 0.7682 0.4676 0.0960 712 | 0.2500 -0.7643 -0.0614 1.6907 713 | 0.8116 -0.2115 -0.7260 0.0617 714 | 2.0919 -3.6133 1.4912 -1.9217 715 | 2.1941 -2.8912 1.5150 -0.9064 716 | -1.8914 4.3030 -1.5844 3.2819 717 | 1.5834 -2.3762 2.1190 -1.6414 718 | -1.5385 3.1096 -3.1794 0.7403 719 | 0.7907 -1.4693 -0.8390 1.8655 720 | -2.5275 3.6909 0.0851 -0.9640 721 | -0.6223 2.3442 -2.5934 5.9819 722 | 0.1819 1.1218 -0.2446 0.4111 723 | 1.8300 -3.6296 1.3749 -1.6477 724 | 1.8891 -3.2785 2.3827 -0.3021 725 | 2.9471 -4.5891 2.9364 2.8915 726 | -0.2555 -0.7282 1.5609 -0.4774 727 | -0.2466 -0.0108 -0.6169 1.0377 728 | 0.5199 -0.2179 1.9092 -0.2896 729 | -1.6583 2.0257 -3.6025 2.5196 730 | 1.1440 -2.3990 1.5525 -1.4829 731 | -0.3222 0.0137 -2.0799 3.7855 732 | -0.2762 0.5465 0.0090 -0.5733 733 | -0.9707 1.9340 -0.4506 0.8483 734 | -1.7554 2.8878 -3.3775 2.6279 735 | 1.0002 -1.9150 2.1717 -3.5622 736 | 1.9198 -2.4457 1.8310 1.3853 737 | -2.1114 4.0411 -2.9991 4.3427 738 | 0.4696 0.1787 0.2097 0.5747 739 | -1.0170 0.4186 0.2125 -1.2098 740 | 0.2543 -1.8581 0.8080 -1.2704 741 | -0.5188 1.4851 -0.1672 -0.0364 742 | -0.2363 -1.4159 0.6137 -0.6576 743 | -0.3346 0.9183 -0.4890 2.3744 744 | 1.6403 -3.7174 3.1576 -3.6328 745 | -0.7413 1.3192 0.2516 1.7977 746 | 1.2935 -2.5978 1.8363 -2.0419 747 | -0.5215 0.9413 0.1162 0.4492 748 | -1.6242 2.3168 0.0903 -1.3101 749 | -1.2568 0.8161 -2.0507 1.0183 750 | 0.9187 -0.6627 0.7200 2.6387 751 | 0.9864 -3.1636 0.9254 0.2961 752 | 2.3889 -4.5698 3.2293 -2.7131 753 | -1.7067 2.0460 -3.0723 1.1502 754 | 1.1388 -1.9816 1.1526 -1.5554 755 | -0.3920 2.4358 -0.6155 0.5625 756 | -1.8825 2.5513 -0.4896 -3.1118 757 | 1.6853 -4.0454 2.7298 0.4027 758 | -2.0988 3.3934 -1.3767 0.9050 759 | -1.2704 2.0068 -1.6652 -1.0216 760 | -0.2885 -1.1837 -0.8939 -0.7224 761 | 2.3683 -4.4616 4.0005 -1.3123 762 | 1.7691 -0.2226 0.6268 1.0731 763 | 0.5896 0.4490 3.1005 -3.1237 764 | 0.4228 -1.7472 2.0891 0.4033 765 | -1.7955 3.1510 -1.7674 2.0881 766 | 2.4847 -3.5130 2.4446 -0.4069 767 | -3.3482 2.5148 -1.5921 -2.9196 768 | -3.4379 6.0661 -4.2876 1.9548 769 | -0.5360 -0.3756 1.9567 -3.6211 770 | -0.2472 -1.1594 0.8571 -2.5802 771 | -2.0752 2.3663 -1.3541 0.2388 772 | 1.5642 -2.2119 2.0732 -1.6247 773 | 1.7296 -0.2041 1.1010 0.1398 774 | 3.9610 -4.8667 4.4228 -1.5343 775 | -2.0695 3.0284 -2.9496 3.0810 776 | 1.5018 -2.2562 -0.5523 0.0616 777 | -0.6183 0.7763 1.5869 -4.6849 778 | -1.2221 0.2261 -3.3640 3.5412 779 | 2.7101 -1.0966 1.1313 0.3147 780 | -0.8781 2.2137 -3.8073 3.9269 781 | 1.7141 -2.0729 0.5598 1.2045 782 | 2.3888 -2.0931 3.9440 -3.7996 783 | -1.0849 2.3981 -1.7999 3.0656 784 | -0.4383 1.2743 -2.0390 -1.8611 785 | 0.5260 -0.6056 -0.5337 -0.8356 786 | -3.3395 7.5858 -7.1056 6.7210 787 | -1.3720 2.5739 -2.0373 3.0435 788 | -3.2173 4.5064 -5.5739 2.2760 789 | -0.9211 0.6790 -0.7887 -0.4795 790 | -3.4521 4.0135 -2.3831 -1.5525 791 | 0.2334 0.0209 -1.4363 0.5307 792 | 0.2051 0.2924 -2.0653 0.5229 793 | -2.3372 1.9558 -1.9614 -0.7905 794 | -0.5103 0.8747 1.6164 -5.2990 795 | 1.4265 -1.4329 1.3139 -1.2606 796 | 0.6899 -0.3550 0.8370 -0.6842 797 | 1.4406 -3.3226 0.8486 2.7026 798 | -0.3213 -0.2226 -1.4243 3.1334 799 | -0.9383 0.8586 -0.4510 -0.6514 800 | 1.0722 0.3533 -0.8133 2.3059 801 | -0.4449 1.7347 -0.8885 2.5464 802 | 1.2098 -1.0579 2.4587 -2.3556 803 | -0.5972 1.7325 -1.2141 0.6929 804 | 1.8557 -2.2163 -0.7773 -3.2109 805 | -3.9633 7.0493 -4.0517 4.0580 806 | 2.3499 -2.4360 -0.4699 0.1907 807 | -2.2090 3.9579 -2.7447 2.5630 808 | 2.0409 -1.3890 0.5305 -0.7100 809 | -1.5530 1.4462 -0.8494 -0.0225 810 | -0.8154 1.7089 -2.6047 0.7712 811 | -1.5494 2.0046 -1.6449 -0.6655 812 | 0.4328 -0.6720 -1.5493 -0.1024 813 | 0.9040 -1.4732 0.4629 -1.4714 814 | -0.5392 0.6420 -1.9468 0.3902 815 | 1.9657 -4.8482 2.5054 -2.1197 816 | -0.9150 -0.3956 -1.6931 -0.4444 817 | 1.2451 -1.3795 1.7663 -3.2962 818 | 1.6866 -2.5111 1.9434 -3.0946 819 | 0.7229 0.4182 -1.3732 1.8016 820 | 2.3166 -1.8348 1.6910 -0.2576 821 | -1.1978 2.1864 -2.6629 3.2079 822 | -2.9081 5.5592 -3.7433 4.0303 823 | 0.1514 0.9284 -0.4192 1.3148 824 | 0.8146 0.9973 1.2935 -0.1016 825 | 0.3800 -0.9516 -0.7254 1.4185 826 | 1.5295 -2.3837 3.3925 -1.6274 827 | 0.3193 -1.1136 1.5844 -2.6091 828 | -0.5814 -0.1342 -1.0138 0.4817 829 | -0.5319 1.9003 -3.3557 -0.2620 830 | 0.0595 -1.7778 1.1247 -1.1881 831 | 2.1838 -2.5284 1.8484 1.0767 832 | 1.1765 -2.7030 1.2177 -3.5466 833 | 1.1729 -2.2183 1.5716 -2.1610 834 | 1.4074 -2.3287 2.3727 -2.8695 835 | -2.1570 5.4622 -3.6060 2.3635 836 | -2.9056 3.1834 -4.0780 3.8333 837 | 3.3327 -5.1715 4.4507 -3.4777 838 | 0.2246 0.4826 -1.7699 3.5009 839 | -1.6216 0.0275 -0.3002 -0.6462 840 | -0.9997 1.4438 -2.5428 5.8892 841 | 1.4724 -1.3622 -0.7678 1.6697 842 | 0.3267 -0.9425 0.6459 -0.9690 843 | -1.5665 3.1099 -2.8111 2.5340 844 | -1.1159 1.4043 -0.0388 0.0484 845 | -1.6853 1.8168 -1.7207 0.8520 846 | -0.3045 1.8391 -1.9626 2.3557 847 | -2.2312 3.9779 -3.4231 1.4446 848 | -2.4957 2.7177 -2.1120 1.8291 849 | -1.5454 1.6509 -2.1169 1.3858 850 | -2.5767 5.8886 -3.7005 2.1089 851 | -3.5095 5.2207 -3.0792 2.2176 852 | 0.9174 -1.5576 -0.1363 -4.1269 853 | -0.1040 -0.7111 2.1954 -1.6140 854 | 1.1009 -0.1596 -0.6922 2.1744 855 | 1.0937 -1.6498 3.0508 -2.9852 856 | -0.8643 4.6597 -5.2543 3.5120 857 | -0.0852 1.5620 -2.4315 2.4271 858 | 3.4260 -6.5707 4.4279 -2.6850 859 | 1.1534 -0.9416 -0.2435 -1.7676 860 | -3.0078 4.0815 -4.6058 4.7613 861 | -1.0728 2.3503 -0.8832 4.3604 862 | -0.9355 -1.9271 0.5078 0.2688 863 | -1.0609 -0.6423 0.4777 -0.7951 864 | -0.0389 2.3210 -0.2672 0.5012 865 | 0.1895 -3.4299 3.3487 -4.4104 866 | 2.5491 -1.8714 -0.0514 -0.1542 867 | -0.5800 0.8920 0.1340 -1.3382 868 | -0.5285 -0.3792 -0.3480 2.1993 869 | 0.8385 -2.4508 -0.2648 2.4220 870 | -0.0739 -0.2533 1.9811 -5.0417 871 | -4.7208 6.0891 -4.0244 3.1378 872 | 2.1551 -4.7074 4.1099 -4.0267 873 | -1.4624 2.4017 -1.4971 0.0732 874 | 0.8731 -1.1784 -0.0538 0.5386 875 | 1.3919 -1.2944 -0.8960 0.9090 876 | 1.0433 -0.8126 0.2852 -2.4083 877 | -1.0498 2.5705 -0.9064 -0.5148 878 | 1.7455 -0.8369 -2.8313 1.3329 879 | -0.9677 2.2147 -3.5659 2.6143 880 | -1.9434 1.0051 0.4136 1.1005 881 | 0.1472 0.3034 0.5597 2.1231 882 | 2.0608 -2.7724 2.9494 2.2164 883 | -0.1577 -0.4008 -0.4644 0.2242 884 | -0.5515 2.1122 -1.2734 0.2451 885 | 0.8898 0.0295 1.6357 -3.3726 886 | -0.8623 4.5674 -2.5880 0.6151 887 | 2.2424 -6.8449 2.2278 -1.4714 888 | 1.1922 -2.9922 5.2063 -7.0552 889 | 2.5713 -4.8439 2.9164 -3.4960 890 | 1.8196 -2.3673 2.6014 -2.9728 891 | 0.4280 0.1382 -1.7576 1.1610 892 | 0.7388 0.0939 2.2428 -2.8571 893 | -2.9329 3.6740 -1.3099 -0.3647 894 | -0.2038 0.9021 0.5237 -2.0779 895 | -1.2065 2.5882 -3.5814 2.1698 896 | 3.4413 -4.1266 -0.0182 0.8868 897 | 0.7141 -0.0004 -0.1035 0.7696 898 | -1.7162 1.0006 -0.9179 -3.5358 899 | -2.2039 2.3200 -1.6724 0.0514 900 | 2.7340 -3.5528 1.8804 -1.0203 901 | -0.4994 1.2852 -1.2943 2.0515 902 | -2.5689 1.2279 -1.1733 0.8831 903 | -0.4562 1.9039 -0.1184 2.8718 904 | -0.0973 -1.0631 1.0433 -1.8119 905 | -1.4423 3.3976 -0.7274 0.5250 906 | -0.3972 1.2705 -3.3115 3.2310 907 | 1.7093 0.0560 -0.1679 -1.6866 908 | 0.3791 -2.6993 1.0324 -2.2579 909 | -1.2452 2.5685 -4.1722 5.1294 910 | 1.3545 -1.9676 0.6502 1.0037 911 | -1.0581 2.0715 -2.9063 0.8582 912 | -2.7012 4.1832 -2.3854 1.4059 913 | 2.1239 -1.5530 1.0820 -0.1460 914 | 0.6080 -0.3952 1.0802 -0.1689 915 | -1.3927 2.4269 -2.2547 2.0877 916 | 1.2666 -0.6127 0.6932 -1.5978 917 | -1.2921 1.6469 -1.3241 3.4079 918 | 0.8801 -2.7622 2.1419 -2.7264 919 | -2.1474 5.4173 -1.8228 0.9176 920 | -2.8582 3.9412 -3.0585 1.3601 921 | 2.7681 -4.1379 1.5593 0.8439 922 | 1.3447 -0.2916 -1.3644 3.5961 923 | 0.4254 0.7426 -1.1264 2.9899 924 | 1.2954 -2.2756 3.6319 -2.9951 925 | -1.3143 0.2553 -0.9582 0.7555 926 | 1.5075 -1.9301 1.5233 -1.3203 927 | 0.4433 -0.8519 1.9387 -1.6657 928 | -1.8945 1.8700 -2.9016 3.0011 929 | 0.7809 0.0584 0.3304 0.4036 930 | -0.7149 0.8361 -0.9331 0.3518 931 | 1.0459 -2.2056 -0.6515 -1.6854 932 | 1.1699 -0.7598 1.0981 -2.4104 933 | 0.8734 -0.9978 0.1512 -2.1817 934 | -1.9300 2.8939 -1.7897 1.4940 935 | -0.6185 0.1926 2.5417 -0.4000 936 | -0.5488 -0.2436 0.5878 1.1406 937 | 0.4166 -1.8235 1.1957 -0.2927 938 | -1.6611 2.1633 -0.2505 0.7485 939 | 0.0914 0.7765 -2.8023 2.8577 940 | 1.1448 -2.6539 0.5378 1.8889 941 | -1.9650 1.7454 -1.7940 -2.4661 942 | 3.1065 -4.7496 2.9677 -2.1307 943 | 0.4019 -0.9636 0.1764 1.5424 944 | -0.4860 1.1219 0.9786 -1.7279 945 | 2.3860 -3.7293 2.2829 -2.4598 946 | 3.6353 -3.8768 2.3513 -2.8779 947 | -2.9467 2.8857 -0.4497 0.9294 948 | -0.4677 0.3421 -1.0009 0.2309 949 | 0.3372 -0.4736 -0.9242 -2.9794 950 | 0.9720 -2.3608 1.4193 2.4428 951 | -2.9585 4.7053 -5.2393 2.9978 952 | 1.1438 -0.9526 1.7973 -1.0424 953 | -1.0902 2.5361 -1.4610 -1.0395 954 | -0.1426 -0.9968 1.5464 -4.5985 955 | -1.9499 0.5039 -0.6940 2.1762 956 | -3.4349 3.2793 -1.0720 -0.5750 957 | -1.0521 0.8308 -0.1208 -1.0018 958 | -0.1782 2.1182 -1.5318 -0.6670 959 | -1.5844 0.9678 0.4949 -0.7587 960 | 0.3264 0.4467 -0.5387 -0.3178 961 | 1.2814 -1.5334 -0.7155 2.4770 962 | -1.6018 1.1515 1.0733 -2.2780 963 | -0.8348 2.6508 -1.3159 -0.8361 964 | -1.1782 2.2640 -1.4300 3.9316 965 | 0.6795 -0.8917 0.8928 0.7091 966 | 5.2131 -6.1695 4.6219 -4.8163 967 | 1.4737 -1.7050 0.9838 -0.8483 968 | 0.5446 -0.0360 0.4342 -2.2048 969 | 0.6494 -1.3413 2.9811 -1.4548 970 | -2.4717 4.2516 -4.1279 2.6051 971 | -0.7725 1.4424 -1.5611 1.2020 972 | 2.6774 -2.6313 1.6314 -0.6541 973 | -1.3634 1.0762 -1.4336 3.4863 974 | 1.2870 -0.6134 0.9685 -0.2057 975 | 0.0514 -0.0785 1.5413 1.3304 976 | -1.6203 0.6220 -2.1104 -0.3684 977 | -1.4634 1.8736 0.6978 -0.0384 978 | -0.6193 2.0030 -0.4309 -0.0306 979 | -0.4093 -0.1578 -0.6319 0.9247 980 | -0.4354 0.6464 2.6831 1.8573 981 | -2.9958 4.3398 -1.4766 -0.6262 982 | 1.0059 -2.5382 3.6359 -3.3206 983 | 0.7826 -1.9593 1.7679 -0.4976 984 | 0.6347 -1.0327 2.1927 -5.7735 985 | 0.3068 -0.4420 1.3557 0.7140 986 | -0.0940 0.1703 0.9483 1.0319 987 | -0.1446 0.0993 3.0105 -1.1109 988 | 1.0615 -0.9156 1.3325 1.1579 989 | 0.8891 1.2227 -2.6427 2.2665 990 | 1.4013 -0.5896 -1.5443 -0.5556 991 | 0.7773 -1.3005 -0.5529 3.7872 992 | 3.4407 -4.1131 2.7247 0.5375 993 | -3.3263 2.0598 -5.2521 3.3535 994 | 1.2069 -1.0435 -2.0167 -1.2310 995 | 0.6565 -0.0669 -1.1570 0.2013 996 | 1.3436 -0.3213 -0.8895 1.4415 997 | 3.5522 -4.1346 3.5319 -2.7047 998 | 0.4108 -0.7597 1.9384 -3.1283 999 | -1.4329 -0.3097 -0.0688 1.2975 1000 | -0.0549 -0.0765 1.0857 0.3450 1001 | 5.6242 -7.1046 3.8849 -3.0839 1002 | -------------------------------------------------------------------------------- /data/params_1.txt: -------------------------------------------------------------------------------- 1 | X1 X2 X3 X4 2 | 0.4221 0.4384 -1.3173 2.9460 3 | 0.9492 1.4172 3.0107 -2.5591 4 | -1.2589 -2.9390 -4.0365 3.1387 5 | -0.1838 -0.0869 0.3865 1.0364 6 | -0.0153 -0.7454 2.1462 -1.6822 7 | -0.3087 -0.3780 -2.5973 3.2732 8 | 1.4135 2.1229 2.2045 -1.9622 9 | -0.3369 0.0961 -4.3773 3.5781 10 | 1.3726 0.4430 3.3575 -3.1190 11 | -0.5519 0.4889 -1.0742 1.0067 12 | -0.3702 0.8806 -0.4347 1.6218 13 | 0.1613 -0.3125 -1.9745 1.4639 14 | -1.9433 -2.0454 -5.5510 4.9709 15 | -0.2373 -0.0943 -1.8291 3.3212 16 | 0.0960 -0.4582 0.2090 -1.6387 17 | 1.5737 1.9769 1.3347 0.4191 18 | -0.6177 0.4303 -3.8961 4.5672 19 | -0.5416 -0.0257 -1.5083 2.2654 20 | 1.3120 0.8179 0.5658 1.3635 21 | -2.7114 -3.6563 -6.6238 5.2493 22 | 2.2458 1.7482 0.7674 -0.8067 23 | 0.1383 -0.0902 1.4498 -2.6829 24 | 1.0011 3.1140 2.4010 1.7335 25 | -0.5098 0.1656 -4.7299 3.8269 26 | -1.2512 -2.4365 -3.6005 2.0945 27 | 1.2103 2.2939 1.8404 -0.4667 28 | 1.3678 1.0705 2.3198 0.6191 29 | 0.8519 0.9737 2.8179 -3.0818 30 | -0.6895 -1.5446 0.7317 -0.9051 31 | 1.7776 3.2422 3.7977 -2.0273 32 | -1.7405 1.9001 -4.4139 4.0717 33 | 1.1029 0.1807 -0.0358 1.7188 34 | 1.7817 0.2406 2.0504 -3.2231 35 | -0.7134 -0.8464 -2.6561 4.0011 36 | 1.2413 1.9334 2.4221 1.2244 37 | 0.2386 0.6823 -1.1959 0.1787 38 | -0.9218 -1.8805 -2.2121 1.8575 39 | 0.0085 0.1856 1.2902 0.6128 40 | 0.8860 2.3912 1.8825 -2.2596 41 | -1.3470 -2.6017 -3.3230 1.4958 42 | -2.3501 -0.2527 -4.6446 5.4920 43 | 1.2622 1.1215 0.8703 -0.5787 44 | -0.3280 0.7944 -3.2052 2.7608 45 | -0.9986 -0.8495 -0.5365 -1.3153 46 | -1.8836 -2.3289 0.6953 -1.3516 47 | 0.7963 0.1409 1.0663 -1.5361 48 | 1.8679 1.8098 4.5032 -2.7037 49 | -0.8342 -1.9214 0.1954 -1.7231 50 | -0.6599 0.0298 -2.0961 2.3547 51 | 0.5265 -1.0956 0.6819 -0.8633 52 | 0.7403 1.5281 6.2942 -5.4374 53 | 2.0280 2.1030 3.2321 -1.7957 54 | -0.5464 -0.2012 -1.3611 2.4479 55 | -1.7944 -1.5835 -4.2611 3.7582 56 | 1.5155 3.0680 5.4686 -5.0525 57 | 0.1578 -0.5712 -3.5115 2.6895 58 | 0.0269 -0.8508 -0.2057 1.7648 59 | 0.0609 -1.1035 -1.1678 -0.0698 60 | 0.4430 1.2429 0.0761 0.4405 61 | -0.5597 -1.8779 -1.6392 0.5823 62 | -0.7618 -1.1871 -1.9504 1.9863 63 | -2.2828 -3.4836 -3.4350 4.0602 64 | 2.6874 1.8042 4.3237 -2.9310 65 | -1.4835 -3.0038 -2.8087 -1.3042 66 | 1.0511 2.0064 -0.6945 -0.3868 67 | -0.9530 -0.4949 -1.8805 0.9986 68 | 3.2304 4.4726 6.7548 -4.6933 69 | -1.4659 -1.2924 -1.3397 -0.1724 70 | -0.0827 -0.7607 -0.9415 0.3493 71 | 0.0107 -2.3775 0.3953 -3.5036 72 | 0.4328 -0.7803 1.4881 -2.8410 73 | -0.0568 -0.7892 -2.0522 1.9636 74 | -0.4649 0.6341 2.1337 -1.9094 75 | -0.5447 1.1631 -1.8098 3.7922 76 | -0.5412 -1.1206 -0.4193 -1.1130 77 | 2.1935 0.9406 2.4002 -1.6031 78 | -0.2036 -1.8214 0.3701 -0.7954 79 | -0.1302 0.9376 -1.1375 -1.0442 80 | -0.8151 -2.0489 -3.1127 3.4073 81 | 2.1216 2.9254 1.1789 0.9501 82 | -0.8000 -1.8094 -3.0985 2.1389 83 | -0.1136 0.2079 0.5581 0.0166 84 | -1.5750 -0.8081 -4.5014 5.6083 85 | -1.1694 -0.8229 -0.9731 -1.3999 86 | -0.5363 -0.7507 -2.2879 3.4020 87 | 0.0659 2.6693 -2.5252 0.6839 88 | 1.2743 0.9704 2.8380 -5.8945 89 | 0.3143 -1.4013 -1.1832 2.2993 90 | 2.4719 1.0353 3.8212 -4.7810 91 | 1.7280 3.1156 1.6403 1.8628 92 | 0.3809 -2.4305 -0.4238 -0.4240 93 | -0.2335 -1.1428 -0.2635 -0.8604 94 | 0.3108 -0.8257 -1.2976 0.6161 95 | -0.0816 0.0180 -1.2420 2.1012 96 | 0.2342 1.0406 0.0705 -0.5182 97 | 2.1600 3.5885 3.1074 -2.4208 98 | -1.3978 0.4984 -4.2853 3.8048 99 | 0.5205 1.5099 1.2366 -1.1065 100 | 1.8619 1.5031 0.5421 -1.1230 101 | 1.0042 1.3626 1.1262 -0.3403 102 | 0.0533 3.5121 0.6921 1.0873 103 | -1.0375 -2.4498 -4.8993 5.2073 104 | 1.7036 0.9064 1.8648 -3.1294 105 | 0.9415 1.3896 2.3639 -0.8299 106 | 1.6802 2.7376 6.4177 -2.9759 107 | -1.0406 -1.1874 -2.3030 2.8096 108 | -0.0602 1.8655 0.7256 1.4306 109 | 0.6997 -1.5696 -0.6425 0.8768 110 | -0.8232 -0.5662 0.4193 0.3471 111 | 1.0750 1.2896 0.4809 0.3900 112 | -0.2770 0.2853 -3.1160 2.9963 113 | 0.8744 -1.3777 1.1802 0.8666 114 | 0.3229 -2.0220 -0.7336 0.8150 115 | 0.3791 -0.5399 1.9064 0.3788 116 | 1.9950 3.8203 0.2543 1.4392 117 | -0.7438 1.1652 0.0391 -0.6343 118 | -0.3964 -2.0365 -0.8261 -2.4984 119 | 0.4931 2.1455 0.2163 1.7033 120 | -0.8151 -1.2609 -1.6957 1.9154 121 | 0.5680 -1.2519 -1.9496 1.6687 122 | 1.5940 2.6880 0.5001 1.8136 123 | -0.1798 -0.6030 -1.2748 -0.0474 124 | -1.1356 -1.9288 -1.0715 1.7402 125 | -0.3189 -1.7417 -3.0155 2.2012 126 | 0.9236 -0.2126 1.1129 -2.1075 127 | 1.5860 2.2490 0.9156 0.6870 128 | -0.5742 1.2993 -0.5665 0.7481 129 | 1.3007 1.5296 2.4215 -0.1881 130 | -1.8416 -1.2974 -2.1990 1.9805 131 | -0.8418 -0.8481 1.7427 -1.4174 132 | 0.8017 -0.4446 1.7721 -0.8251 133 | -1.3454 -2.2427 -0.8648 0.3529 134 | 1.2588 1.1594 1.0904 0.9119 135 | -1.3497 -1.3655 -2.8564 2.3510 136 | 2.3817 2.8072 4.0609 -3.0936 137 | 1.3820 1.6532 2.9098 -1.2292 138 | 1.4827 3.0207 2.7008 -2.3162 139 | 1.4449 -1.5429 3.9433 -2.9984 140 | -1.6225 -1.3788 -1.1630 0.5102 141 | 0.7046 0.6381 2.1051 -3.0108 142 | 1.3322 0.1194 2.0138 -1.7477 143 | -1.4934 1.5691 -3.7732 4.5560 144 | -1.4324 -2.0244 -2.4805 1.4298 145 | 1.2891 0.5035 4.1002 -6.2902 146 | 0.2724 0.0563 0.8724 -0.5333 147 | -0.1669 -1.0851 -0.9390 -0.8744 148 | 0.8352 1.7432 0.3819 0.8269 149 | 0.2182 -2.0789 0.2213 -1.5635 150 | 1.2184 1.5160 1.3717 0.5089 151 | 0.2872 2.1123 2.0826 0.2479 152 | 0.7521 -0.4908 2.7687 -1.7748 153 | 1.0511 1.8088 -0.2405 -1.3373 154 | -0.6982 -2.3512 -0.8518 -0.1299 155 | -1.8685 -1.2945 -6.1929 5.9108 156 | 2.0928 2.5377 5.2196 -5.9488 157 | 2.0260 1.6135 1.3948 -0.6602 158 | -1.6393 -2.6317 -4.9696 0.9858 159 | -2.6279 -2.6216 -5.4898 2.6160 160 | 0.1795 1.5979 -0.8810 4.4242 161 | 0.0662 0.8502 -1.3737 1.4543 162 | 1.1938 0.7956 -1.3887 0.1524 163 | 1.9644 1.2960 2.7610 -2.0831 164 | -0.7438 -1.7077 -0.8291 -1.0895 165 | -0.4597 -2.1041 -2.1065 0.7512 166 | 1.3718 3.2860 5.0568 -3.5782 167 | -3.2924 -2.9738 -9.2873 6.8004 168 | 0.3266 -0.0157 -2.6747 3.1481 169 | -1.1471 0.8667 -0.4318 2.8683 170 | -0.5594 -1.0770 -2.6702 3.5538 171 | -1.1435 0.8109 -3.0400 3.0015 172 | 0.5848 -0.3361 -0.6288 2.5193 173 | 0.6064 0.2134 3.8596 -2.6834 174 | -0.4914 -2.7708 -0.6787 -0.6707 175 | 2.1360 2.9496 5.5263 -4.4301 176 | 1.1309 -0.7875 1.8785 -0.7299 177 | -0.9808 0.8936 -0.9309 1.1030 178 | 0.0944 -0.1684 -0.1508 -0.9904 179 | -1.0203 -1.3748 0.8601 0.8602 180 | 1.6617 0.5431 1.6265 -0.8985 181 | -0.4051 1.9592 2.1060 -0.6222 182 | -2.5894 -4.1678 -2.8560 1.0738 183 | 0.3031 1.8596 1.7285 -2.8316 184 | 0.9035 1.3588 0.9366 -0.7800 185 | 2.1394 2.3134 3.4171 -1.3870 186 | 0.5316 -0.8055 0.2680 -0.7528 187 | 2.3502 3.5247 4.6712 -0.9047 188 | -1.8994 -0.8916 -2.9110 3.2466 189 | 0.5426 -0.7229 0.3876 -0.7971 190 | -0.3920 0.3660 -2.2785 3.1365 191 | 1.0449 0.9205 3.7890 -0.2354 192 | 2.0753 1.1596 3.9070 -2.4280 193 | 0.3357 -0.5130 -1.0780 -0.4683 194 | -0.5928 0.0881 -0.1836 -0.9254 195 | -1.2659 -0.9978 -1.0359 0.3054 196 | 1.1711 0.7434 4.0947 -3.5762 197 | -0.3725 -0.1824 1.6879 -2.0108 198 | -0.3386 -0.0924 -1.7751 -0.0003 199 | -1.3178 -3.8849 -5.4367 4.2559 200 | 0.5460 -0.0285 1.9712 -1.9296 201 | -1.4471 0.9032 -1.6257 2.2724 202 | 2.3111 2.3026 6.5581 -7.5970 203 | -1.7932 -2.0270 -5.5022 6.7413 204 | -2.9694 -4.1483 -6.1015 3.0931 205 | -0.6716 0.3793 1.3510 -0.5138 206 | 1.5549 2.0291 2.8580 -0.3100 207 | -0.3361 -1.0339 -0.0237 1.5034 208 | -1.0818 -1.9339 -0.0445 0.5863 209 | -0.8095 2.1480 1.9382 1.8058 210 | -0.7383 1.1371 1.5550 -0.7095 211 | -2.3481 -3.7457 -5.2956 0.0905 212 | -0.7928 -0.0381 0.6234 -1.0773 213 | 0.2111 1.4635 0.9228 0.4841 214 | 2.1464 4.2999 4.3042 -2.4572 215 | 0.5996 -0.5279 3.2525 -3.3798 216 | -0.1402 2.3598 -1.2377 1.1719 217 | -0.8706 -2.3439 -3.0613 1.8819 218 | 1.0252 1.8943 1.8854 0.6542 219 | -0.2315 -1.7033 -0.8078 -1.8235 220 | 0.9203 1.7557 2.9017 -2.7575 221 | 0.0720 0.2353 -0.6472 1.0341 222 | 0.9023 -0.1701 0.3757 -0.8528 223 | -1.5155 -0.1245 -2.8353 4.2380 224 | 1.7210 1.4789 4.3153 -6.0321 225 | -0.2678 -1.2289 -1.5351 1.2349 226 | 1.0075 -1.2985 1.0202 -3.2551 227 | -1.0951 -1.3614 -0.2926 1.0003 228 | -0.5328 0.3670 -0.6750 0.2740 229 | -0.2096 1.7322 -1.0528 1.2531 230 | -0.1730 1.8005 0.1456 0.3775 231 | 1.5614 0.6388 4.0117 -3.7534 232 | 0.6454 1.6328 3.6341 -3.9130 233 | 0.5907 -0.8215 -0.1281 1.5731 234 | -1.4879 -3.8450 -4.1064 0.2378 235 | 1.0088 1.6449 2.8611 -4.4131 236 | 1.4601 0.1024 2.4678 -1.5117 237 | 0.3695 1.2409 -0.5709 1.6225 238 | -4.1015 -4.0449 -9.0040 8.0869 239 | -0.1721 -2.1993 -2.2324 0.1576 240 | 1.1400 1.2867 1.0537 0.2433 241 | -1.0768 -0.3870 -1.8456 -0.8726 242 | -2.5927 0.4117 -4.5035 2.5381 243 | 0.1352 -0.0056 -0.9499 1.6577 244 | -0.7668 -1.0976 0.3385 -1.0852 245 | -0.2308 0.2340 2.0068 -2.3547 246 | -0.5311 -1.8421 -3.1554 1.2833 247 | 1.2256 1.2933 4.6867 -1.7969 248 | 0.3557 -0.5998 1.0450 -0.8946 249 | 3.4559 2.1941 6.9349 -5.8478 250 | 0.4847 0.6631 2.2031 -1.7367 251 | -1.4702 -1.9361 -0.2175 -3.0276 252 | -0.0126 1.4828 -1.1065 1.7595 253 | 0.7725 -1.6608 0.3436 0.0653 254 | 1.3629 -0.9063 4.3995 -6.1864 255 | 2.0368 1.4317 4.3147 -3.2661 256 | 1.2608 1.0917 0.0254 1.9426 257 | -0.4288 3.3123 1.7569 -0.1571 258 | -0.5591 -1.8184 -1.4255 0.9952 259 | 1.0064 0.3755 -0.2447 0.3557 260 | -0.4902 0.8934 1.4711 -0.5725 261 | 1.3334 -2.2710 3.5222 -4.3250 262 | 0.3685 0.5561 0.6917 -0.7538 263 | -0.2291 -1.0220 -1.3849 1.1744 264 | -0.4519 -2.9717 -3.4148 1.7864 265 | 1.6125 1.6404 0.7039 2.3613 266 | -0.9058 -0.1002 2.7017 -2.3626 267 | 0.5988 0.2731 1.4601 -0.2672 268 | 1.3374 2.0414 1.3772 -0.4913 269 | -0.4077 1.1350 -1.2892 1.8102 270 | 1.2018 -1.5562 0.7782 -1.6808 271 | -0.4459 -0.2122 -1.9862 2.9121 272 | 0.9134 0.5364 5.0529 -4.3478 273 | 0.8670 0.8845 0.8534 1.0234 274 | 1.1584 1.5535 3.2380 -1.9452 275 | -0.7084 -2.9439 -2.3624 2.4472 276 | -0.5929 0.2061 -4.6020 3.9335 277 | 2.7290 2.2243 5.4626 -6.0632 278 | 1.0492 0.1157 0.9385 -1.8301 279 | 2.6296 1.4288 6.5523 -6.6688 280 | -1.4478 -2.7953 -5.5835 3.0066 281 | -1.3150 -3.1975 -0.9487 1.1275 282 | -0.2918 0.1629 2.7850 -1.8335 283 | 0.7717 2.8904 2.3819 -0.4475 284 | 0.1558 -0.3002 2.2535 -3.5183 285 | -1.5040 -0.2251 -2.8013 1.1889 286 | -0.2877 -0.1999 -1.7336 2.9412 287 | 0.8268 2.3178 1.7893 0.0100 288 | 0.9968 1.0185 -0.1383 1.7876 289 | 0.6877 1.2983 2.5730 -3.5440 290 | 1.5436 0.2673 1.6253 -3.6913 291 | -0.0914 -0.3981 -2.0548 3.4705 292 | -0.9880 -0.3287 -0.7854 0.4069 293 | 1.4285 2.5875 1.2680 1.7061 294 | -0.4086 0.2145 -0.4502 0.4815 295 | 1.3865 1.7876 3.0702 -2.2037 296 | -1.4396 -1.9437 -2.7500 1.4544 297 | -0.4854 -1.1706 -1.9562 1.4765 298 | 0.6932 0.7210 5.2635 -4.6271 299 | 0.4473 -0.1053 -0.0610 -1.5039 300 | 1.2486 0.3165 3.5894 -4.5874 301 | -1.0020 -1.8378 -0.2352 1.7369 302 | 1.0761 0.5849 2.0370 -1.7983 303 | 0.8080 -0.3826 3.5695 -2.3067 304 | -1.3195 -0.5294 -5.8050 7.1090 305 | 1.2316 1.0195 3.5572 -1.6951 306 | 0.7826 0.4403 1.2962 -0.9682 307 | 1.1665 -0.2042 0.7832 0.1215 308 | 0.7219 0.6794 -1.9772 1.5906 309 | 1.0696 0.6326 1.7247 -0.3414 310 | 0.3270 2.0521 1.6197 -1.7773 311 | -0.3591 1.1746 2.0382 -1.0370 312 | -0.0176 0.0498 -1.1415 0.6802 313 | 0.1384 -0.5503 -1.9090 2.8729 314 | -0.0398 -1.3852 -0.6622 0.2763 315 | 0.2408 0.4574 -2.2373 3.1889 316 | -2.5765 -3.7507 -4.5438 5.2000 317 | 0.4908 -0.0332 2.1604 -1.9665 318 | 1.0731 2.6972 1.4610 -0.7973 319 | -0.8413 -1.4488 -0.9764 1.0266 320 | -0.5542 -0.7063 -3.2696 4.7550 321 | 1.0102 0.7882 4.2588 -3.9340 322 | 0.1450 0.6975 1.8223 0.0678 323 | 0.2828 0.7426 -0.6122 0.5385 324 | 2.2403 1.4689 3.4380 -3.7422 325 | -0.8625 -0.1129 -3.6903 2.8163 326 | 0.8827 0.7347 2.9758 -1.5375 327 | -0.8258 -2.8022 0.8067 -1.6966 328 | 3.0356 3.4338 6.6386 -4.2144 329 | -0.1238 0.3456 -1.8563 1.0319 330 | -2.1536 -2.8786 -1.4978 -0.2480 331 | 0.2414 -0.3007 -3.2513 3.0289 332 | -1.1192 -0.9764 -0.9241 0.3775 333 | -1.3837 -1.1293 -0.6887 0.8602 334 | -2.1137 -3.0968 -4.9341 2.9998 335 | -0.0979 0.1959 -0.3551 1.1983 336 | 0.4240 0.2546 1.4607 -0.7983 337 | -0.9771 -1.6813 -2.4644 2.8643 338 | -0.0643 -0.2702 1.2848 -4.1266 339 | -1.5268 -3.0281 -3.3209 0.5872 340 | -0.5284 -2.2488 -4.4298 3.7614 341 | -0.0429 -1.3719 -0.3469 -1.9798 342 | 0.2387 -0.1271 0.7121 -0.6782 343 | 1.0610 0.3634 0.3579 -2.4776 344 | -2.1118 -1.3960 -2.1465 2.3440 345 | 0.4140 -1.5741 0.8931 -0.1832 346 | -0.5889 -1.8865 -2.4828 1.8725 347 | -0.7008 -1.9102 0.2421 -0.3865 348 | 1.4182 0.1309 1.0218 -0.9057 349 | 0.4784 0.0289 1.4581 -1.9601 350 | 1.3327 1.3803 3.7734 -3.0391 351 | 1.3492 2.1318 1.6804 -2.0360 352 | -0.8169 -0.3050 -2.6177 1.3214 353 | 0.3106 -0.1786 -0.2707 0.6259 354 | -0.0322 0.3086 1.7010 0.2549 355 | 1.3485 1.7519 0.9032 -0.2329 356 | 1.9703 1.0191 5.6907 -4.1068 357 | -0.7059 -1.1646 -4.5834 5.1654 358 | -1.3912 -0.6543 -0.4590 0.2121 359 | 1.0457 1.2616 2.5750 0.6115 360 | 1.5790 -0.6112 2.2807 -3.3287 361 | 0.7463 -0.6071 2.3301 -2.7091 362 | -0.8863 -1.2792 -3.3897 0.8131 363 | -1.2480 -2.6815 -2.0513 1.1016 364 | -1.2951 -1.5037 -3.0437 2.9696 365 | 0.1988 -0.1523 -0.1351 1.2128 366 | 1.7862 1.0209 2.3765 -1.0301 367 | 0.0232 -0.2054 -1.2976 0.6003 368 | 2.2411 -0.9455 2.9019 -4.4060 369 | -0.6376 -0.7584 -1.1063 0.7693 370 | 0.1973 -0.5247 -1.7270 2.6850 371 | -0.5810 0.0675 1.6841 -3.6887 372 | 1.3109 3.9982 5.7956 -4.4117 373 | 1.2774 1.2307 4.2570 -3.9394 374 | 0.8357 0.6900 2.6966 -4.5268 375 | 0.1960 -0.3030 -1.8123 2.0318 376 | 1.4537 2.9059 5.3114 -6.1683 377 | 1.4870 1.9721 2.0162 -2.3447 378 | 0.1487 -0.1423 2.0458 -3.4138 379 | 2.4838 2.9584 4.8436 -3.1080 380 | -1.7007 0.4949 -3.1421 3.0229 381 | -0.0767 0.9124 0.6103 -2.3290 382 | 1.3003 1.1504 4.1766 -3.4119 383 | 2.4847 -0.8935 5.2028 -5.5396 384 | 0.5247 0.4676 4.0276 -2.1602 385 | 0.4765 0.8766 3.3361 -0.7136 386 | 1.5709 0.5149 3.5040 -3.7556 387 | 2.0771 0.4484 4.1284 -3.7246 388 | -0.0891 0.6212 0.5538 0.2757 389 | -0.3320 -1.1612 -3.7698 2.1168 390 | 2.8789 2.0328 8.2193 -8.5263 391 | -2.9083 -3.3313 -5.3299 5.0328 392 | -0.9839 -0.0696 -0.0955 0.4527 393 | -1.2441 1.9562 -2.0649 2.5998 394 | 0.2834 2.2278 1.0234 0.2243 395 | 0.8445 0.4794 -0.7517 0.7243 396 | -0.4047 -0.4710 2.0105 -2.9939 397 | 0.3239 -0.1109 -0.5258 0.6693 398 | 0.2588 -1.0334 0.7332 -3.0833 399 | 1.8482 1.4504 3.4422 -2.1724 400 | -1.7409 -1.2615 -5.0336 3.7104 401 | -0.4281 2.5417 -0.4135 2.6137 402 | 1.1448 -0.7006 2.7636 -3.1788 403 | 1.4227 4.4986 1.9905 1.8105 404 | 0.1742 0.0261 -0.6839 -0.0361 405 | -0.6525 -1.0191 -3.2400 2.2132 406 | 0.2606 1.4683 -0.7828 1.5069 407 | -0.2412 -1.3175 0.0373 -1.5513 408 | -0.0175 1.3999 4.3298 -5.6834 409 | 1.4820 2.8175 2.5687 -1.0200 410 | 2.0134 0.1965 3.5009 -3.3929 411 | -1.2145 -1.8609 1.4664 -4.2407 412 | -0.4802 -1.0327 -0.5054 0.9732 413 | -0.2647 1.3140 -0.8950 2.4167 414 | -2.7675 -2.2948 -3.0091 1.9055 415 | -0.2573 -0.3701 0.8630 0.3414 416 | 0.2458 1.5357 0.9590 -2.0151 417 | -0.6165 1.4784 2.6500 -3.6100 418 | 0.4031 0.2714 2.9359 -1.8832 419 | 0.5934 1.6299 2.1325 -0.9504 420 | 0.9474 1.0787 0.9585 -3.3317 421 | -0.4336 -2.2205 -2.6955 2.3728 422 | 1.7193 2.1809 2.5452 -0.6334 423 | 1.8018 1.5586 1.8424 1.0107 424 | -2.1023 -1.8680 -5.3176 5.2661 425 | -0.0040 0.8033 -1.8068 0.2447 426 | -1.1871 -0.9583 -4.9276 2.5868 427 | -0.0534 0.1875 0.1293 -0.6111 428 | -1.7277 -2.1077 -1.5254 0.8533 429 | 1.1112 2.0105 2.5280 -1.3788 430 | 0.2168 -1.6762 1.7040 -3.3157 431 | 1.1384 0.6374 1.6482 1.2901 432 | -0.3773 0.4084 -4.0038 3.3591 433 | -1.4849 -3.1382 -3.7851 3.1311 434 | 2.2148 2.9897 3.3275 -0.1572 435 | 1.0283 1.8381 5.6544 -5.1633 436 | -0.3917 1.3397 0.0095 0.2976 437 | 0.5030 1.2775 3.6297 -2.6396 438 | 1.6763 1.0144 6.1336 -5.0702 439 | -0.5492 -0.7054 2.6119 -3.1852 440 | 0.3001 0.5844 -0.4320 1.4743 441 | 1.9061 2.4351 2.3581 -1.5055 442 | 0.7647 -0.7681 0.3428 -1.7734 443 | -1.2509 0.5251 0.2771 -1.0364 444 | -0.1489 -1.3473 1.0857 -0.1641 445 | -0.2176 0.0417 0.6293 -0.3938 446 | -1.0656 -1.5191 -0.0053 -1.6797 447 | -1.4897 -2.0528 -4.0325 4.0726 448 | -3.6290 -5.3014 -5.6506 4.6000 449 | -0.8540 0.2747 -3.8989 4.6577 450 | -1.5562 -1.3178 -3.6415 2.5800 451 | -0.0357 1.9113 0.0393 2.4706 452 | 1.1600 -0.0665 3.2032 -2.0242 453 | 0.0074 -0.1853 -0.6150 2.8065 454 | 1.6184 0.0356 2.6802 -0.8727 455 | -0.3741 0.4066 0.2414 0.9678 456 | -0.3044 0.5077 0.5705 0.4339 457 | -0.5406 -0.9668 -0.2168 -1.0771 458 | 1.0601 0.6901 2.5941 -2.8898 459 | 0.2634 1.8413 -1.2870 2.5712 460 | -2.4324 -2.4471 -4.3391 4.2879 461 | -2.7327 -0.0412 -3.8631 1.0503 462 | -1.0175 -2.2728 -0.1626 -1.5627 463 | -1.1080 -1.0050 1.0603 -0.5066 464 | -1.2206 -3.3028 -3.9826 3.6547 465 | -0.0076 -2.5139 0.8435 -1.3532 466 | 0.4005 -0.6428 0.5448 -1.0270 467 | -1.1336 0.2474 -0.6572 1.2060 468 | 1.7286 1.9731 3.5904 -3.3995 469 | 0.1675 0.1514 -0.8637 3.4922 470 | 0.3097 0.8796 -0.2108 -0.0779 471 | -0.3254 -0.4969 -1.0881 1.9348 472 | 0.0363 -0.9665 -0.0703 -0.4665 473 | 0.5319 -1.4919 -2.2974 2.5919 474 | 0.6288 0.7998 3.6209 -2.1737 475 | -0.5335 2.4944 -2.8886 3.5566 476 | 1.3921 2.7560 5.6088 -5.3341 477 | -0.4104 -2.8793 1.6658 -2.6562 478 | -0.0840 0.0132 0.8154 2.4806 479 | 0.7330 -0.1490 -0.1950 -1.2075 480 | 1.9442 2.2098 3.6322 -3.5461 481 | 2.3104 2.0191 2.4832 -2.0771 482 | 1.1945 -0.2601 1.8794 -2.4854 483 | -0.0667 0.2148 1.3808 -0.1781 484 | 1.5517 1.8335 5.2327 -3.6159 485 | -1.1672 -0.5829 -4.0546 3.5922 486 | 2.4052 4.8488 5.2471 -1.0166 487 | -0.5882 0.2308 1.2214 -0.4744 488 | 0.2314 0.6349 -0.1210 2.6659 489 | 0.5457 -0.1376 0.4434 0.7594 490 | 0.4623 -0.5657 2.4360 -1.6137 491 | 0.0220 1.5290 -0.4958 0.7654 492 | -0.8717 0.2540 0.8885 -1.7240 493 | -1.1096 0.1498 -1.8292 1.5767 494 | 0.2771 1.8464 2.5500 -0.9636 495 | 0.7788 0.4695 2.6543 -0.2071 496 | -1.2805 0.5941 0.3031 0.2070 497 | -0.5894 -2.7659 2.1839 -1.7521 498 | 0.6621 1.6978 -0.4947 2.3835 499 | 0.1120 0.3543 0.0859 1.1393 500 | -0.4318 0.4988 0.7392 -1.1712 501 | 1.7640 2.2872 2.2433 0.1755 502 | -1.0258 -0.1392 -0.5919 0.8601 503 | 0.6705 -0.1807 -0.8380 -0.9691 504 | 0.1467 -0.5993 -0.7674 -0.1996 505 | -0.3711 -1.4255 -0.6464 1.1862 506 | 1.4505 4.4049 -0.0964 2.3239 507 | -2.5216 -1.7532 -6.6575 4.5629 508 | -0.3691 0.8252 0.4696 0.6042 509 | 0.7819 1.0549 1.5382 -2.7436 510 | 1.8091 0.5833 5.8846 -5.2786 511 | -0.9688 -1.8804 -1.8577 0.4901 512 | 1.4828 0.1630 7.0501 -6.0849 513 | 0.5272 0.2210 4.0813 -5.0069 514 | 1.8930 1.3868 4.0628 -5.0543 515 | 0.9389 -0.2721 2.3473 -2.0869 516 | 1.1803 1.7784 2.4449 -0.1889 517 | 1.0609 -0.7485 0.4142 -1.5863 518 | -0.1359 1.6251 2.6516 -2.9342 519 | 1.4142 1.0649 3.4620 -4.9002 520 | 0.6008 -1.2809 1.9329 -2.6476 521 | 0.6043 2.8750 1.8431 -0.4951 522 | 0.5065 1.7988 1.0119 -0.6114 523 | 0.8628 2.0477 0.8844 0.2036 524 | 3.2462 2.9185 7.9731 -7.5870 525 | -0.1379 -0.4886 -4.8918 4.0995 526 | -1.3593 -0.4968 -1.0808 -1.1390 527 | 2.7757 2.2563 3.7685 -1.5405 528 | 1.1590 1.5534 2.7799 -0.0688 529 | -0.1413 0.8298 1.6892 -1.0343 530 | -0.8638 0.9030 -1.7259 4.5435 531 | -0.5567 -0.2590 -0.8997 0.6125 532 | -0.1543 2.3830 2.8560 -1.4861 533 | 3.1945 3.0466 5.0699 -3.0448 534 | 0.1866 -0.7855 0.4653 -0.5346 535 | 1.3384 -1.1408 4.4893 -5.2114 536 | 0.3941 -0.3620 -2.3235 1.6339 537 | -0.8142 -1.8180 -2.2444 2.2256 538 | -0.7526 0.3858 0.6852 0.6928 539 | 0.5812 2.7461 4.0869 -2.0584 540 | -1.6324 -1.7109 -7.8246 6.6612 541 | -1.3821 -1.5081 -5.0492 5.2010 542 | 1.9084 3.5973 4.2449 -4.0506 543 | -1.1294 -2.3737 -1.8158 1.5849 544 | -1.2417 -1.4748 -0.9370 0.8973 545 | 0.4228 1.7431 0.2517 1.8793 546 | 1.3096 2.3971 3.3020 -1.5678 547 | 0.6783 1.0503 1.2364 -2.2278 548 | 2.4131 -0.5640 3.9111 -4.5779 549 | -2.0309 -3.8018 -2.9857 1.1926 550 | 1.0318 1.9862 1.0901 -1.4298 551 | 1.0278 0.7019 1.8038 -1.2205 552 | 0.9475 -0.3721 3.3908 -2.6908 553 | 0.4622 0.5492 0.2317 -1.0423 554 | -1.3727 -1.9553 -1.4638 1.8602 555 | 1.4251 2.2830 3.1546 -3.7820 556 | 1.2113 2.1431 0.2968 1.2388 557 | -1.2505 -0.1807 0.8611 -2.5957 558 | 0.4768 -0.4560 0.3060 0.4227 559 | -1.5786 -2.3952 -2.9030 3.7656 560 | -0.4390 0.6961 0.0453 -0.8613 561 | -0.1089 0.0583 0.5922 -1.5381 562 | -2.1364 -1.2403 -7.1205 7.4554 563 | 0.1300 -0.7509 0.0829 0.7459 564 | 1.0827 1.6930 2.3512 0.4223 565 | 1.2527 0.8023 0.4160 0.4510 566 | -0.4434 0.3203 -0.5736 -0.8615 567 | -1.7101 1.1834 -3.1879 3.3757 568 | -0.9616 -0.6284 -0.8966 -0.4528 569 | -1.5883 -1.6392 -3.3259 2.1540 570 | -0.1931 1.0047 -1.6955 2.2410 571 | 1.0905 2.9007 1.6767 -0.3381 572 | 1.0968 1.8233 2.4394 -2.9024 573 | 0.9667 2.1248 4.2196 -1.7983 574 | -1.6148 0.4089 -3.5129 1.7873 575 | 2.0176 4.0677 4.6033 -1.8887 576 | -0.3824 -0.1504 -0.9108 -1.2141 577 | 1.3798 0.3674 1.6223 -0.1609 578 | 0.3617 -0.0634 1.5684 -0.9209 579 | -0.7017 -0.0774 -0.5790 -0.8977 580 | 0.6044 0.6246 1.7464 -1.0592 581 | -0.3688 -2.1519 1.1904 -0.7954 582 | -2.3101 -3.3738 -3.5312 3.4569 583 | 1.1885 2.8202 3.4020 -2.8410 584 | 0.0845 -0.1411 -0.2544 1.4883 585 | -0.5307 0.6239 -0.0764 3.6316 586 | -0.4763 0.4447 -0.5638 -1.1510 587 | 1.4152 1.3564 1.7857 -1.8701 588 | -1.5210 -0.4126 -2.4485 0.8362 589 | -0.8487 -1.3262 -1.8305 0.6240 590 | -0.8947 -0.5605 -0.4703 -0.3529 591 | 0.7686 2.4885 1.1331 0.6781 592 | 1.6384 2.5118 1.3864 0.1621 593 | 1.0010 1.7451 -0.2762 0.2595 594 | 0.4807 1.4548 4.9742 -3.2610 595 | 1.0473 2.0668 4.3525 -3.3097 596 | 0.0788 -1.4203 2.4255 -0.3301 597 | -2.2306 -3.8870 -3.7001 1.9159 598 | 0.5874 1.6003 -0.7438 1.6549 599 | 1.4756 2.2393 4.0787 -3.8391 600 | -0.5030 1.4913 0.2074 1.0861 601 | -0.4347 0.6785 -2.6748 2.3082 602 | -0.1111 -1.3967 -1.6404 1.2834 603 | 1.5639 2.8363 2.5642 -2.9118 604 | 1.2511 0.6893 4.1057 -4.2018 605 | -0.4250 1.0096 1.4236 1.4049 606 | 0.0815 -0.9773 1.0435 -2.9788 607 | -0.1817 -0.8652 -2.8114 1.5907 608 | 0.5952 1.0976 -1.1152 -1.3025 609 | -1.3392 -0.3130 -4.6895 3.8328 610 | -0.1405 -0.9766 -0.0223 2.0270 611 | -0.1753 -0.5500 -1.7572 0.6174 612 | 2.3826 1.6173 3.3825 -2.3766 613 | 0.4081 0.2211 1.7949 -0.9556 614 | 0.1571 -2.2358 1.2337 -2.0532 615 | 0.5492 -0.4672 2.4981 -2.8609 616 | -2.7580 -1.7945 -5.1297 2.6354 617 | 0.1006 0.1469 0.9435 -1.3105 618 | 0.2636 0.9543 0.2570 0.7055 619 | 1.2427 2.5572 2.0227 0.5339 620 | 0.0293 -0.2815 0.8742 -0.3877 621 | -0.8928 2.0082 -4.2166 7.0338 622 | 0.8227 -2.2286 0.9022 -1.9991 623 | 0.2750 -2.3933 1.3408 -4.5404 624 | 1.0314 0.0165 2.8261 -1.7506 625 | 1.5891 -0.0366 6.2175 -3.1655 626 | -1.0055 -2.9451 -1.2092 -0.8216 627 | 0.6522 0.6545 0.2166 -0.7901 628 | -0.7011 -0.8955 -2.6927 2.4811 629 | 1.2141 1.6892 0.8590 1.8449 630 | -1.0424 1.1561 -2.6228 2.1177 631 | -0.6658 -0.0976 -0.8541 0.0506 632 | -0.1820 1.7439 -0.7883 2.0911 633 | 0.5704 1.7059 0.5362 0.0811 634 | -1.7730 -3.8503 -0.6296 -3.0181 635 | -1.0346 -0.0355 0.5912 -2.3518 636 | 0.7074 1.6568 1.4173 0.3832 637 | 0.2438 -0.8389 0.0342 1.1134 638 | 0.4378 0.2198 -0.5559 2.7590 639 | 0.3426 0.9553 -0.2672 -0.6559 640 | 1.1168 2.2127 1.1917 1.4978 641 | 1.7877 0.3554 2.3804 -3.6787 642 | -0.1044 3.0831 1.1879 -0.2972 643 | -1.4695 -1.7326 -1.1774 0.1953 644 | 2.4817 3.4065 5.9234 -2.8419 645 | 0.8637 -0.1261 2.8507 -2.9793 646 | 1.9671 1.2499 2.9712 -4.2806 647 | 0.4974 0.2890 -0.8741 1.6884 648 | 1.1620 2.0488 3.8843 -3.9454 649 | -2.2098 -3.5932 -3.7391 1.6634 650 | -0.1332 -0.7305 2.6645 -1.6099 651 | 0.4648 0.8003 0.4025 -2.1358 652 | -0.1363 -0.0967 1.6756 -1.4968 653 | -0.1277 0.7906 0.0377 -2.0824 654 | 0.5539 1.9192 3.2564 -2.4236 655 | -1.7684 -0.6146 -2.1915 2.5153 656 | -0.5654 0.1659 -4.0975 4.2905 657 | 1.4508 0.8496 2.4828 -2.1395 658 | 1.7822 0.2653 3.6706 -4.7081 659 | -0.2624 -2.2014 0.2433 -0.5328 660 | 1.1261 2.9495 -0.5723 0.7239 661 | -0.1907 -1.1867 0.9616 -1.6157 662 | -0.8731 1.2671 -3.2853 3.8146 663 | 0.0332 -2.5754 -1.2272 -1.0377 664 | -1.5423 -0.4592 -0.5829 0.8995 665 | -2.8951 -2.2287 -4.3907 2.8129 666 | -0.0237 -0.7932 -2.1966 4.8650 667 | -1.1942 -1.7105 -2.9147 1.6773 668 | -0.5189 -0.4373 3.1877 -3.1881 669 | 0.2745 -1.3961 1.2401 -2.8285 670 | -0.1617 -1.2290 -2.4578 -0.1563 671 | 0.6373 -0.4517 0.3370 0.6078 672 | 0.3218 0.8918 4.7222 -5.6828 673 | 1.3758 2.7275 2.1637 -0.7284 674 | 1.6085 2.7398 3.1448 -3.4195 675 | 1.6736 1.9384 5.0966 -2.4717 676 | -1.3293 -3.2025 -4.4141 3.1804 677 | 0.1278 0.3685 2.6931 -1.8363 678 | 0.1585 1.0251 0.2425 -0.0684 679 | -0.8808 -1.3826 0.7173 -1.1581 680 | 1.6407 0.3166 5.7555 -5.7785 681 | 1.8027 3.4724 3.2196 -2.1314 682 | 1.2006 1.0765 1.7169 -2.1488 683 | -0.5764 0.2289 -0.2922 1.4868 684 | 1.4423 1.6906 1.6567 -1.1824 685 | 1.7092 -0.0274 2.5530 -2.1152 686 | 1.0716 2.2295 3.2452 -2.5768 687 | -0.6006 -1.3288 -2.2388 2.8637 688 | -0.7205 -0.6912 1.6515 -3.2910 689 | -1.1837 0.3507 -1.6879 3.1121 690 | 0.5626 2.8380 1.4699 -0.4932 691 | -0.7537 -0.6953 -3.1658 3.0637 692 | 1.2367 0.6409 0.9917 1.5116 693 | -1.1035 -0.7161 -3.7742 2.4336 694 | -1.8684 -0.4997 -4.0247 3.3118 695 | 1.6296 2.2559 1.9531 -0.8001 696 | 0.5641 2.1938 -0.2567 3.3194 697 | 1.6163 -0.8917 1.4851 -0.5876 698 | -1.5329 -1.6924 -0.8626 -0.0505 699 | -0.1108 2.1406 0.7755 2.5766 700 | 1.1528 2.4641 1.9131 -2.0588 701 | -1.6771 -4.0750 -1.7141 0.7877 702 | -0.3782 0.8156 -0.2093 0.8619 703 | 2.0759 0.8934 2.1463 -0.1229 704 | -2.1752 -1.2210 -4.4540 5.1064 705 | -0.7154 -1.0728 -2.1205 1.2905 706 | -1.1868 -1.1752 -0.7381 1.2352 707 | 2.6860 3.6245 4.3923 -2.1751 708 | 0.1989 -1.3788 -0.5605 -2.0883 709 | 0.0528 0.4353 1.2900 -4.1841 710 | -0.4220 0.3202 1.7995 -2.0235 711 | -0.5720 0.3538 -2.5897 1.2366 712 | -0.3566 -0.6282 3.0268 -2.7038 713 | -0.9071 -1.9049 -2.3987 -0.8474 714 | -1.0017 -0.1582 0.9731 -0.2732 715 | -2.1240 -2.3114 -5.0146 4.0583 716 | 0.4511 2.6216 0.5775 0.3030 717 | -1.0954 -1.9547 -0.2099 -2.2556 718 | 1.3981 0.3082 -0.3138 -0.4408 719 | 0.5745 1.6630 1.5069 0.3801 720 | 0.3224 0.1636 -0.1116 0.4408 721 | -0.1363 0.2411 -4.3640 4.1182 722 | 0.2307 -1.0134 -1.3896 1.6590 723 | -1.6146 -0.6353 -3.6840 5.0874 724 | -0.2182 -0.3006 -1.3621 2.7167 725 | 0.9655 -0.0760 5.2645 -2.7839 726 | 1.7344 -1.1806 4.6002 -4.5242 727 | -1.7375 -3.8363 -1.8884 2.6531 728 | -1.5359 -3.4614 -2.3717 -1.6653 729 | 1.4541 -0.4962 4.9849 -4.5826 730 | 0.9732 0.3811 3.5966 -3.2958 731 | -0.4781 -1.0741 -1.7739 0.9003 732 | 0.4542 0.9803 0.9116 0.6760 733 | 0.6460 -1.3613 1.0015 -2.8363 734 | -0.2928 0.5428 -0.1714 2.9715 735 | 1.4964 1.3080 2.3591 -1.2514 736 | 0.2136 0.7576 -1.1299 1.1749 737 | 0.4673 1.0442 1.7568 -2.2547 738 | 0.5142 -1.6821 -2.4375 3.4751 739 | 0.9527 1.5655 1.8220 -1.6853 740 | 0.2410 0.2732 0.1940 -0.3887 741 | -0.3573 1.8085 -1.3991 2.5519 742 | -0.1760 0.4221 1.1440 0.0856 743 | 3.0036 2.7840 6.8599 -6.8364 744 | 0.1090 1.0491 0.9933 2.0995 745 | 0.2818 0.9315 0.8843 0.2420 746 | 2.8380 2.2410 2.8134 -1.8016 747 | 0.5023 3.1495 4.0731 -1.8039 748 | -0.0582 -2.7374 -1.0129 -0.4615 749 | -0.5505 -1.6343 -1.5596 3.2186 750 | 1.0784 3.9231 1.0863 -1.5243 751 | -1.2314 -3.0780 -1.6409 0.2469 752 | 0.1335 0.4838 -3.9621 4.9386 753 | 1.2333 2.0928 4.0071 -3.1075 754 | -1.2693 -0.0084 -2.4141 1.6782 755 | -1.9385 -3.4060 -4.0442 1.9451 756 | -0.5854 -1.4130 -1.2278 2.3809 757 | -0.2398 -1.7605 0.1230 1.1292 758 | 0.2825 -0.8113 -1.5813 0.7049 759 | -0.9477 -2.1846 0.4015 -0.8040 760 | -0.1302 -0.4408 -0.1537 0.6034 761 | 0.2546 0.2144 2.7379 -2.3807 762 | -0.9835 -0.9002 -4.9966 3.1901 763 | 0.5829 0.3994 2.1473 -1.7142 764 | -3.1554 -2.0211 -6.5150 4.4761 765 | -0.0377 -0.0528 3.3062 -3.6839 766 | 1.5333 3.7894 1.7485 -0.7265 767 | 2.0764 -0.6427 2.2172 -3.8340 768 | 1.1776 1.7066 2.5069 -0.5581 769 | 0.3302 -1.4003 -2.5360 4.2944 770 | -1.2482 -0.1976 -2.0711 0.9456 771 | -0.2406 -2.4457 -0.2400 -1.8886 772 | -0.3726 -0.4929 -1.6038 1.0137 773 | 0.0544 -0.5156 -0.3858 2.3670 774 | -2.2220 -3.4974 -5.8398 3.5884 775 | 1.1348 2.2434 2.9514 -0.1895 776 | 0.0070 0.3971 0.5286 0.0357 777 | 0.7752 -0.4956 0.1650 -0.7048 778 | 0.1221 0.8675 2.5748 -2.9283 779 | 0.7972 -1.8370 2.5939 -3.3404 780 | -0.2612 -1.0567 1.2505 0.3564 781 | 1.3166 0.9626 4.0171 -4.9185 782 | -0.6494 -2.4589 -0.2840 0.6803 783 | 1.1047 2.3211 5.3088 -0.5314 784 | -1.8453 0.2950 -4.0475 4.7546 785 | -1.0978 -1.8395 0.7786 -0.3847 786 | -0.8782 -2.0656 -0.4668 0.2880 787 | 0.2871 -0.0816 1.1756 -3.5576 788 | 0.1089 -1.1181 0.7253 1.2728 789 | 0.3108 -1.2102 2.3103 -3.5735 790 | -0.1983 -1.3945 2.4447 -2.1784 791 | -0.3916 0.4559 -1.2069 -0.4552 792 | -1.3762 -2.9663 -4.9833 4.1377 793 | 1.2871 2.4920 1.4206 0.0362 794 | 0.7636 0.3324 1.9423 -0.4482 795 | -0.5444 -3.4782 1.5397 -5.9865 796 | -1.1021 -2.6265 -2.0601 1.0722 797 | -0.3405 0.1923 -1.0233 0.3243 798 | -0.3976 -0.7552 -0.8215 -0.9807 799 | 2.4827 3.4896 8.4584 -5.1560 800 | 0.1649 0.2971 -1.9113 0.4320 801 | 1.0341 0.3985 0.3581 0.6171 802 | -0.3598 -0.4640 0.6991 0.5921 803 | 1.0401 -1.0886 3.5171 -4.5617 804 | -0.4498 -2.0178 0.5046 -0.7718 805 | -0.6825 -0.2963 -3.2908 2.4110 806 | -0.3828 -1.2803 2.8865 -1.2187 807 | 1.8802 1.6709 6.1067 -5.9179 808 | 0.8295 1.7834 2.1371 -0.3955 809 | 0.0102 3.0084 -0.5084 3.4905 810 | 0.5776 0.3626 -0.9278 -2.0204 811 | -0.8143 1.4269 -1.1079 1.3061 812 | 1.4822 1.4707 5.5991 -2.7516 813 | 0.4070 -0.7230 -0.2261 -1.3777 814 | 4.7846 3.7717 7.3800 -6.2177 815 | -0.2100 2.8019 -1.4262 0.7606 816 | 0.5760 1.6616 3.5575 -2.3607 817 | 2.3035 2.2732 4.2988 -3.4140 818 | -0.9769 -1.6534 -3.3927 2.0202 819 | -2.4994 -0.7589 -2.4763 3.0263 820 | 1.0841 1.0333 2.1069 -1.3734 821 | 0.0034 -0.3016 -3.8329 4.4283 822 | 0.1927 2.6055 1.1588 0.8050 823 | -0.9424 -0.1511 -1.6369 2.9666 824 | 0.1256 0.6592 0.1015 -0.4799 825 | 0.1968 0.1535 0.3561 0.0075 826 | 0.4280 -0.7153 -1.4028 3.2275 827 | 0.7786 -0.8761 1.1569 -2.4780 828 | -0.1515 -1.8705 -0.8812 -0.1000 829 | -1.2129 0.1701 -0.9798 2.3051 830 | 1.0773 2.9089 1.7891 -1.8625 831 | -1.9326 -3.0425 -2.9845 0.8451 832 | -2.5948 -2.8116 -8.4860 7.3264 833 | -0.5301 0.1297 0.3395 -0.1824 834 | 0.0192 -2.3884 -0.5182 -0.3134 835 | -0.0522 0.5292 3.8994 -5.9149 836 | -2.6437 -4.9097 -4.2886 1.9631 837 | 0.8417 -0.0547 1.9772 -1.2452 838 | 1.3192 1.5192 2.4677 -0.9588 839 | 2.7803 3.0402 5.4138 -3.1573 840 | -1.8456 -0.3769 -2.8370 3.0724 841 | -0.5356 0.0502 0.0274 -1.3851 842 | -1.0116 -0.2560 -1.5152 1.8756 843 | -1.2691 -1.8207 -2.8566 2.2257 844 | -2.9592 -1.6625 -4.5308 2.7724 845 | 1.3376 0.0780 0.6282 -2.0318 846 | 1.6955 2.7780 3.2655 -1.2321 847 | -0.4962 0.0688 -1.0017 2.2376 848 | 0.5164 -0.5692 -0.5619 1.7152 849 | -1.4864 -0.3974 -3.5628 2.1193 850 | 0.6519 0.7522 -0.1924 -0.6601 851 | -0.8696 -1.2542 1.2233 -2.7148 852 | -1.3554 -2.4747 -2.8165 2.0809 853 | -0.5958 -1.3723 -3.0388 2.2133 854 | -0.2181 -0.3331 -2.4112 -0.3126 855 | 1.3758 -0.0168 1.7395 -0.9770 856 | 0.0204 -0.1737 0.7407 -2.0824 857 | 1.0847 -0.0647 3.1116 -3.8508 858 | 0.7748 0.8022 1.8025 -1.7415 859 | -1.0252 -1.2644 -3.1217 3.6045 860 | 0.1826 0.1773 -0.3842 0.5366 861 | 1.4103 -0.3573 4.3991 -4.1621 862 | -0.2224 1.2868 -0.3958 1.9198 863 | 0.3426 0.3517 2.7783 -4.4088 864 | 2.3729 3.4145 5.9708 -4.1185 865 | 0.2591 0.5197 0.6004 -1.7345 866 | -0.8681 -0.8067 -5.0768 3.9601 867 | -0.6154 0.6562 -0.7971 1.1270 868 | 0.3239 -1.7496 1.3340 -2.4100 869 | -2.1064 -1.8042 -4.6845 3.7453 870 | 0.6683 0.6338 0.5402 -1.2266 871 | -2.6646 -1.8687 -4.5452 4.8848 872 | -0.3647 -1.2198 -2.8048 1.8247 873 | -0.6127 -0.3272 -1.2679 0.3454 874 | -1.7400 -1.4406 -1.8326 0.9992 875 | -0.1949 -0.9344 0.8785 -2.6007 876 | -0.5906 0.8698 1.6671 -0.2432 877 | -0.1016 1.3325 -0.1791 1.1254 878 | -1.7227 -3.3169 -6.0545 2.1066 879 | -1.1291 -1.1761 0.7185 -0.0358 880 | -0.2963 -1.0722 -2.6762 2.1816 881 | 0.0638 -0.5047 0.8469 -0.1959 882 | 0.4864 0.5108 4.0873 -2.8461 883 | 1.5949 2.8785 5.8924 -5.7475 884 | 0.8358 0.3985 -0.0952 -1.0542 885 | 0.4649 -0.2477 -2.4579 3.7152 886 | 1.6585 3.3086 4.1332 -3.9437 887 | -0.1360 -2.5494 -2.7867 2.2152 888 | 0.4012 2.6478 0.3925 0.7472 889 | 0.5966 -0.4979 2.0857 -1.0566 890 | 2.7507 3.7337 7.5218 -5.4947 891 | -0.4696 -2.0639 -0.5819 -0.7127 892 | 0.0606 0.8769 1.4734 -2.7369 893 | -0.4070 0.0100 0.8166 0.6752 894 | 0.9719 -0.2078 -0.9551 1.1452 895 | 1.9718 2.4406 4.9346 -2.7550 896 | -1.1506 1.6626 -3.4655 1.0998 897 | -0.2366 0.8708 -0.1483 0.3447 898 | -0.4721 0.9020 -1.3401 1.9453 899 | -0.6147 -1.4378 -0.2758 0.1698 900 | 2.2717 0.7812 3.1275 -1.7342 901 | 0.1132 0.7270 -1.3677 -0.4701 902 | -0.5304 -0.2478 -1.4542 1.6716 903 | -1.3161 -0.2612 -3.6551 1.6417 904 | -1.2769 -0.9436 -3.3018 0.4782 905 | -0.3208 -1.4066 -0.5900 -1.4112 906 | 0.1059 1.8202 0.2379 -1.1848 907 | -2.1978 -2.4442 -4.8365 2.3883 908 | 0.1587 1.5477 0.7988 0.1191 909 | 1.5613 3.8589 2.6686 -1.1137 910 | 0.6241 0.3305 2.7025 -2.7390 911 | -0.3806 -2.2565 -0.0469 0.8878 912 | 1.7690 -0.2489 3.8450 -5.0639 913 | -0.4449 0.2964 -4.3500 2.1049 914 | 2.0994 2.7141 4.3622 -5.2659 915 | 0.5318 1.2363 3.3073 -3.5220 916 | 0.7683 -2.3456 0.0126 -1.2680 917 | -2.3450 -4.2979 -4.3552 3.2049 918 | 0.6160 3.0790 -0.1070 1.0240 919 | -1.8849 -2.7989 -2.5195 -0.1890 920 | 0.1586 0.9480 1.7823 -1.7179 921 | 0.5691 1.8857 0.7091 -4.0504 922 | -0.4613 -0.4608 -0.6497 -1.7062 923 | 1.2753 3.0873 0.6291 -0.6398 924 | 0.1073 -0.8329 1.1176 0.1849 925 | -1.3496 -2.4360 -1.7843 0.5189 926 | -0.8198 -1.4718 -2.6834 3.2494 927 | 0.1722 0.6237 -0.6878 2.6488 928 | 1.0178 1.6270 -0.4138 -0.3747 929 | -0.1366 -1.6372 0.1285 -0.7308 930 | 0.6704 2.1385 0.7335 0.8871 931 | 0.7890 1.6467 3.2952 -2.5976 932 | 3.6151 2.0056 7.8652 -8.1088 933 | -1.5352 -0.0485 -3.8208 3.0523 934 | -1.4060 -1.0717 -1.7603 -1.6007 935 | -1.1863 -0.6363 -2.2183 1.6123 936 | 1.5496 2.4745 2.1847 -1.3431 937 | -1.8499 -0.6329 -0.1811 0.4338 938 | 0.2072 -0.1804 0.4082 -1.7626 939 | 0.3458 1.8013 3.0923 -1.4103 940 | -0.0694 -3.3736 -1.4420 -0.2100 941 | 1.5385 0.6984 4.2233 -3.2894 942 | 0.6955 1.6870 0.3974 -0.1101 943 | -0.6076 -1.5684 -3.4748 4.3326 944 | -0.0365 -0.1675 1.5558 -1.3237 945 | -0.1194 0.6756 1.3247 0.2663 946 | -1.1577 -0.5517 -2.9294 1.6068 947 | -0.8170 -2.5973 -1.3295 0.8809 948 | 0.3804 1.5432 -0.3541 1.4189 949 | -0.0824 -0.9253 -0.4567 0.5768 950 | -0.1741 -0.1642 -2.1875 0.4246 951 | -0.1718 1.1064 -0.6609 -1.6192 952 | -0.9055 -0.4940 -2.4176 1.7905 953 | -1.5150 -2.6009 -2.6577 1.4493 954 | -0.1064 -1.1496 -0.7267 0.1980 955 | -1.7595 -0.7345 -4.4818 3.2017 956 | -0.2289 0.1311 -1.1109 -0.9558 957 | 0.4064 2.0264 1.3587 -0.7615 958 | -0.8551 -0.2973 -0.3452 -0.8025 959 | 0.9702 1.5659 2.1626 -0.6366 960 | 0.2939 1.2526 -0.1189 1.8658 961 | -1.4682 -1.7908 -5.3585 2.6703 962 | -0.9855 -0.2616 -2.2157 2.4479 963 | 1.6280 1.3096 2.5282 -1.5845 964 | 0.5126 0.4484 2.1478 -1.4552 965 | -1.1912 -0.5212 -2.7978 0.7178 966 | -1.1988 -0.3221 -1.5681 2.6952 967 | 0.7929 1.0772 0.3456 0.2040 968 | 1.1535 2.0657 2.9134 -2.1122 969 | 0.6162 0.9338 1.4200 0.1007 970 | -0.6909 -0.7126 -1.4572 2.0843 971 | -1.2405 -2.5348 -1.2961 -0.3561 972 | -0.4239 -0.6389 -1.7818 1.3040 973 | 1.3915 0.3651 0.5989 0.9374 974 | -2.0606 -0.2140 -2.2648 2.7552 975 | -0.2142 -0.2045 0.2653 -0.9797 976 | -0.1477 -0.8864 -0.4609 0.7602 977 | -0.7074 -2.2578 0.3184 -2.6673 978 | 1.0040 1.0383 2.7508 -4.6825 979 | 0.4410 -0.0470 2.7774 -2.2094 980 | -0.4109 -2.9471 -2.1369 0.9780 981 | 0.3816 -0.2858 2.6062 -3.1575 982 | 0.8521 1.4565 -0.0733 1.2292 983 | -1.0888 -0.1359 1.1683 -2.6620 984 | 0.3447 -0.6569 1.2974 -1.8227 985 | -1.5570 -1.0419 -4.4403 2.1029 986 | 0.4889 2.6463 1.4866 1.9629 987 | -1.3828 -1.6130 -2.8327 -1.3808 988 | 2.4356 0.5078 4.5393 -4.9270 989 | 2.3195 3.0621 5.8867 -7.0965 990 | -1.5778 -3.4421 -4.7022 5.3480 991 | 0.2143 -0.2319 -0.8225 1.1643 992 | 0.7414 -1.2725 1.2544 -1.2023 993 | -0.1595 0.1827 -0.9906 1.8405 994 | 1.7140 -0.0130 1.9959 -2.2336 995 | -0.3711 -1.1818 0.0451 -1.5664 996 | -0.3583 -1.1808 -1.6697 2.2321 997 | 0.0775 0.5683 -1.6643 0.4994 998 | 2.5427 2.0092 4.5448 -2.7661 999 | 1.4372 3.2044 2.0283 0.8661 1000 | 0.9254 -0.1970 1.4643 -1.7150 1001 | 1.1724 4.2455 0.5621 0.5849 1002 | -------------------------------------------------------------------------------- /data/params_1_graph.txt: -------------------------------------------------------------------------------- 1 | Graph Nodes: 2 | X1,X2,X3,X4 3 | 4 | Graph Edges: 5 | 1. X1 --> X2 w = 1.0 6 | 2. X1 --> X3 w = 2.0 7 | 3. X2 --> X4 w = 0.5 8 | 4. X3 --> X4 w = -1.0 9 | 10 | -------------------------------------------------------------------------------- /fges.py: -------------------------------------------------------------------------------- 1 | import networkx as nx 2 | import itertools 3 | import graph_util 4 | from sortedcontainers import SortedListWithKey 5 | from meekrules import MeekRules 6 | import numpy as np 7 | import time 8 | import dill 9 | import os 10 | from knowledge import Knowledge 11 | 12 | 13 | class Arrow: 14 | __slots__ = ['a', 'b', 'na_y_x', 'h_or_t', 'bump', 'index'] 15 | def __init__(self, a, b, na_y_x, hOrT, bump, arrow_index): 16 | self.a = a 17 | self.b = b 18 | self.na_y_x = na_y_x 19 | self.h_or_t = hOrT 20 | self.bump = bump 21 | self.index = arrow_index 22 | 23 | 24 | class FGES: 25 | """ 26 | Python FGES implementation, heavily inspired by tetrad 27 | https://github.com/cmu-phil/tetrad 28 | 29 | TODOs: 30 | 31 | - There is a way to set preset adjacencies in the tetrad algorithm, 32 | which constrains the edges that can actually be set. That's not 33 | implemented here. 34 | 35 | - Symmetric First Step unimplemented. 36 | 37 | """ 38 | 39 | def __init__(self, variables, score, filename='', checkpoint_frequency=0, 40 | save_name=None, knowledge=None, verbose=False): 41 | self.top_graphs = [] 42 | self.last_checkpoint = time.time() 43 | # How often fges-py will save a checkpoint of the data 44 | self.checkpoint_frequency = checkpoint_frequency 45 | self.save_name = save_name 46 | # List of the nodes, in order 47 | self.variables = variables 48 | 49 | # Meant to be a map from the node to its column in the dataset, 50 | # but in this implementation, this should always be a map 51 | # from x -> x, i.e. {1:1, 2:2, ...} 52 | # self.node_dict = {} 53 | self.score = score 54 | self.sorted_arrows = SortedListWithKey(key=lambda val: -val.bump) 55 | self.arrow_dict = {} 56 | self.arrow_index = 0 57 | self.total_score = 0 58 | self.sparsity = score.penalty 59 | # Only needed for their `heuristic speedup`, it tells 60 | # you if two edges even have an effect on each other 61 | # the way we use this is effect_edges_graph[node] gives you 62 | # an iterable of nodes {w_1, w_2, w_3...} where node and 63 | # w_i have a non-zero total effect 64 | self.effect_edges_graph = {} 65 | self.cycle_bound = -1 66 | self.stored_neighbors = {} 67 | self.graph = None 68 | self.removed_edges = set() 69 | self.filename = filename 70 | self.in_bes = False 71 | self.knowledge = knowledge 72 | self.verbose = verbose 73 | 74 | def set_knowledge(self, knowledge): 75 | if not isinstance(knowledge, Knowledge): 76 | raise TypeError("knowledge must be of type Knowledge") 77 | else: 78 | self.knowledge = knowledge 79 | 80 | def get_dict(self): 81 | return {"graph": self.graph, 82 | "sparsity": self.sparsity, 83 | "filename": self.filename, 84 | "nodes": len(self.variables), 85 | "knowledge": self.knowledge} 86 | 87 | @classmethod 88 | def load_checkpoint(cls, filename): 89 | with open(filename, 'rb') as f: 90 | return dill.load(f) 91 | 92 | def search(self): 93 | """ 94 | The main entry point into the algorithm. 95 | """ 96 | # Create an empty directed graph 97 | if self.graph is None: 98 | self.graph = nx.DiGraph() 99 | self.graph.add_nodes_from(self.variables) 100 | # print("Created Graph with nodes: ", self.graph.nodes()) 101 | 102 | # for now faithfulness is assumed 103 | self.add_required_edges() 104 | 105 | self.initialize_forward_edges_from_empty_graph() # Adds all edges that have positive bump 106 | 107 | # Step 1: Run FES and BES with heuristic 108 | # mode. The mode is used in reevaluate_forward 109 | self.mode = "heuristic" 110 | if not self.in_bes: 111 | self.fes() 112 | self.sorted_arrows = SortedListWithKey(key=lambda val: -val.bump) 113 | self.arrow_dict = {} 114 | self.stored_neighbors = {} 115 | self.initialize_arrows_backwards() 116 | self.in_bes = True 117 | 118 | if self.checkpoint_frequency > 0: 119 | self.create_checkpoint() 120 | 121 | self.bes() 122 | 123 | # Step 1: Run FES and BES with covernoncolliders 124 | # mode. The mode is used in reevaluate_forward 125 | 126 | # self.mode = "covernoncolliders" 127 | # self.fes() 128 | # self.bes() 129 | # print(self.graph.edges()) 130 | return self.get_dict() 131 | 132 | def fes(self): 133 | """The basic workflow of FGES is to first consider add all edges with positive bump, as defined 134 | by the SEMBicScore, to a sorted list (sorted by bump). 135 | Edges are popped off this list and added to the graph, after which point the Meek rules are utilized to 136 | orient edges in the graph that can be oriented. Then, all relevant bumps are recomputed and 137 | the list is resorted. This process is repeated until there remain no edges to add with positive bump.""" 138 | # print("Running FES.`.") 139 | # print("Length of sorted arrows", len(self.sorted_arrows)) 140 | # print(self.arrow_dict) 141 | while len(self.sorted_arrows) > 0: 142 | if self.checkpoint_frequency > 0 and (time.time() - self.last_checkpoint) > self.checkpoint_frequency: 143 | self.create_checkpoint() 144 | self.last_checkpoint = time.time() 145 | max_bump_arrow = self.sorted_arrows.pop(0) # Pops the highest bump edge off the sorted list 146 | x = max_bump_arrow.a 147 | y = max_bump_arrow.b 148 | # print("Popped arrow: " + str(x) + " -> " + str(y)) 149 | 150 | if graph_util.adjacent(self.graph, x, y): 151 | continue 152 | 153 | na_y_x = graph_util.get_na_y_x(self.graph, x, y) 154 | 155 | # TODO: max degree checks 156 | # print(na_y_x) 157 | 158 | if max_bump_arrow.na_y_x != na_y_x: 159 | continue 160 | 161 | # print("Past crucial step") 162 | 163 | if not graph_util.get_t_neighbors(self.graph, x, y).issuperset(max_bump_arrow.h_or_t): 164 | continue 165 | 166 | if not self.valid_insert(x, y, max_bump_arrow.h_or_t, na_y_x): 167 | # print("Not valid insert") 168 | continue 169 | 170 | T = max_bump_arrow.h_or_t 171 | bump = max_bump_arrow.bump 172 | 173 | # TODO: Insert should return a bool that we check here 174 | inserted = self.insert(x, y, T, bump) # Insert highest bump edge into the graph 175 | if not inserted: 176 | continue 177 | 178 | self.total_score += bump 179 | # print("Edge set before reapplying orientation: " + str(self.graph.edges())) 180 | visited_nodes = self.reapply_orientation(x, y, None) # Orient edges appropriately following insertion 181 | # print("Edge set after reapplying orientation: " + str(self.graph.edges())) 182 | to_process = set({}) 183 | 184 | # check whether the (undirected) neighbors of each node in 185 | # visited_nodes changed compared to stored neighbors 186 | for node in visited_nodes: 187 | # gets undirected neighbors 188 | new_neighbors = graph_util.neighbors(self.graph, node) 189 | stored_neighbors = self.stored_neighbors.get(node) 190 | if stored_neighbors != new_neighbors: 191 | to_process.add(node) # Reevaluate neighbor nodes 192 | 193 | to_process.add(x) # Reevaluate edges relating to node x 194 | to_process.add(y) # Reevaluate edges relating to node y 195 | 196 | self.reevaluate_forward(to_process, max_bump_arrow) # Do actual reevaluation 197 | 198 | def bes(self): 199 | """BES removes edges from the graph generated by FGES, as added edges can now have negative bump in light 200 | of the additions to the graph after those edges were added.""" 201 | 202 | while len(self.sorted_arrows) > 0: 203 | if self.checkpoint_frequency > 0 and (time.time() - self.last_checkpoint) > self.checkpoint_frequency: 204 | self.create_checkpoint() 205 | self.last_checkpoint = time.time() 206 | 207 | arrow = self.sorted_arrows.pop(0) 208 | x = arrow.a 209 | y = arrow.b 210 | 211 | if (not (arrow.na_y_x == graph_util.get_na_y_x(self.graph, x, y))) or \ 212 | (not graph_util.adjacent(self.graph, x, y)) or (graph_util.has_dir_edge(self.graph, y, x)): 213 | continue 214 | 215 | if not self.valid_delete(x, y, arrow.h_or_t, arrow.na_y_x): 216 | continue 217 | 218 | H = arrow.h_or_t 219 | bump = arrow.bump 220 | 221 | self.delete(x, y, H) 222 | 223 | meek_rules = MeekRules(knowledge=self.knowledge) 224 | meek_rules.orient_implied_subset(self.graph, set([x, y])) 225 | 226 | self.total_score += bump 227 | self.clear_arrow(x, y) 228 | if self.verbose: 229 | print("BES: Removed arrow " + str(x) + " -> " + str(y) + " with bump -" + str(bump)) 230 | visited = self.reapply_orientation(x, y, H) 231 | 232 | to_process = set() 233 | 234 | for node in visited: 235 | neighbors = graph_util.neighbors(self.graph, node) 236 | str_neighbors = self.stored_neighbors[node] 237 | 238 | if str_neighbors != neighbors: 239 | to_process.update([node]) 240 | 241 | to_process.add(x) 242 | to_process.add(y) 243 | to_process.update(graph_util.get_common_adjacents(self.graph, x, y)) 244 | 245 | # TODO: Store graph 246 | self.reevaluate_backward(to_process) 247 | 248 | def initialize_arrows_backwards(self): 249 | for (node_1, node_2) in self.graph.edges(): 250 | if self.knowledge is not None and not self.knowledge.no_edge_required(node_1, node_2): 251 | continue 252 | self.clear_arrow(node_1, node_2) 253 | self.clear_arrow(node_2, node_1) 254 | 255 | self.calculate_arrows_backward(node_1, node_2) 256 | 257 | self.stored_neighbors[node_1] = graph_util.neighbors(self.graph, 258 | node_1) 259 | self.stored_neighbors[node_2] = graph_util.neighbors(self.graph, 260 | node_2) 261 | 262 | def calculate_arrows_backward(self, a, b): 263 | """Finds all edges with negative bump""" 264 | 265 | if self.knowledge is not None and not self.knowledge.no_edge_required(a, b): 266 | return 267 | 268 | na_y_x = graph_util.get_na_y_x(self.graph, a, b) 269 | _na_y_x = list(na_y_x) 270 | _depth = len(_na_y_x) 271 | 272 | for i in range(_depth + 1): 273 | choices = itertools.combinations(range(0, _depth), i) 274 | for choice in choices: 275 | diff = set([_na_y_x[k] for k in choice]) 276 | h = set(_na_y_x) 277 | h = h - diff 278 | 279 | if self.knowledge is not None and not self.valid_set_by_knowledge(b, h): 280 | continue 281 | 282 | bump = self.delete_eval(a, b, diff, na_y_x) 283 | 284 | if bump > 0: 285 | if self.verbose: 286 | print("Evaluated removal of an arrow " + str( 287 | a) + " -> " + str(b) + " with bump: " + str(bump)) 288 | self.add_arrow(a, b, na_y_x, h, bump) 289 | 290 | def delete_eval(self, x, y, diff, na_y_x): 291 | """Evaluates the bump of removing edge X-->Y""" 292 | a = set(diff) 293 | a.update(graph_util.get_parents(self.graph, y)) 294 | a = a - {x} 295 | return -1 * self.score_graph_change(y, a, x) 296 | 297 | def reevaluate_forward(self, to_process, arrow): 298 | # print("Re-evaluate forward with " + str(to_process) + " " + str(arrow)) 299 | for node in to_process: 300 | if self.mode == "heuristic": 301 | nzero_effect_nodes = self.effect_edges_graph.get(node) 302 | # print("Re-evaluate forward. Currently on node: " + str(node)) 303 | # print("nzero-effect-nodes: " + str(nzero_effect_nodes)) 304 | elif self.mode == "covernoncolliders": 305 | g = set() 306 | for n in graph_util.adjacent_nodes(self.graph, node): 307 | for m in graph_util.adjacent_nodes(self.graph, n): 308 | if graph_util.adjacent(self.graph, n, m): 309 | continue 310 | 311 | if graph_util.is_def_collider(self.graph, m, n, node): 312 | continue 313 | 314 | g.update(m) 315 | 316 | nzero_effect_nodes = list(g) 317 | if nzero_effect_nodes is not None: 318 | for w in nzero_effect_nodes: 319 | if w == node: 320 | continue 321 | if not graph_util.adjacent(self.graph, node, w): 322 | self.clear_arrow(w, node) 323 | self.calculate_arrows_forward(w, node) 324 | 325 | def reevaluate_backward(self, to_process): 326 | for node in to_process: 327 | self.stored_neighbors[node] = graph_util.neighbors(self.graph, node) 328 | adjacent_nodes = graph_util.adjacent_nodes(self.graph, node) 329 | 330 | for adj_node in adjacent_nodes: 331 | if graph_util.has_dir_edge(self.graph, adj_node, node): 332 | self.clear_arrow(adj_node, node) 333 | self.clear_arrow(node, adj_node) 334 | 335 | self.calculate_arrows_backward(adj_node, node) 336 | elif graph_util.has_undir_edge(self.graph, adj_node, node): 337 | self.clear_arrow(adj_node, node) 338 | self.clear_arrow(node, adj_node) 339 | self.calculate_arrows_backward(adj_node, node) 340 | self.calculate_arrows_backward(node, adj_node) 341 | 342 | def reapply_orientation(self, x, y, new_arrows): 343 | to_process = {x, y} 344 | if new_arrows is not None: 345 | to_process.update(new_arrows) 346 | 347 | return self.meek_orient_restricted(to_process) 348 | 349 | def meek_orient_restricted(self, nodes): 350 | # Runs meek rules on the changed adjacencies 351 | meek_rules = MeekRules(undirect_unforced_edges=True, 352 | knowledge=self.knowledge) 353 | meek_rules.orient_implied_subset(self.graph, nodes) 354 | return meek_rules.get_visited() 355 | 356 | def valid_insert(self, x, y, T, na_y_x): 357 | union = set(T) 358 | 359 | if self.knowledge is not None: 360 | if self.knowledge.is_forbidden(x, y): 361 | return False 362 | for node in union: 363 | if self.knowledge.is_forbidden(node, y): 364 | return False 365 | 366 | if na_y_x != set([]): 367 | union.update(na_y_x) 368 | return graph_util.is_clique(self.graph, union) and \ 369 | not graph_util.exists_unblocked_semi_directed_path( 370 | self.graph, y, x, union, self.cycle_bound) 371 | 372 | def valid_delete(self, x, y, H, na_y_x): 373 | 374 | if self.knowledge is not None: 375 | for h in H: 376 | if self.knowledge.is_forbidden(x, h): 377 | return False 378 | if self.knowledge.is_forbidden(y, h): 379 | return False 380 | 381 | diff = set(na_y_x) 382 | diff = diff - H 383 | return graph_util.is_clique(self.graph, diff) 384 | 385 | def add_required_edges(self): 386 | """Tetrad implementation is really confusing and seems to be 387 | mostly checks to ensure required edges don't form a cycle""" 388 | if self.knowledge is None: 389 | return 390 | 391 | for edge in self.knowledge.required_edges: 392 | # Make sure the required edges aren't a cycle 393 | if not edge[0] in graph_util.get_ancestors(self.graph, edge[1]): 394 | graph_util.remove_dir_edge(self.graph, edge[1], edge[0]) 395 | graph_util.add_dir_edge(self.graph, edge[0], edge[1]) 396 | if self.verbose: 397 | print(f"Adding edge from knowledge: {edge[0]} -> {edge[1]}") 398 | 399 | for edge in self.knowledge.required_connections: 400 | graph_util.add_undir_edge(self.graph, edge[1], edge[0]) 401 | 402 | def initialize_two_step_edges(self, nodes): 403 | for node in nodes: 404 | 405 | g = set() 406 | 407 | for n in graph_util.adjacent_nodes(self.graph, node): 408 | for m in graph_util.adjacent_nodes(self.graph, n): 409 | 410 | if node == m: 411 | continue 412 | 413 | if graph_util.adjacent(self.graph, node, m): 414 | continue 415 | 416 | if graph_util.is_def_collider(self.graph, m, n, node): 417 | continue 418 | 419 | g.update(m) 420 | 421 | for x in g: 422 | assert (x is not node) 423 | if self.knowledge is not None: 424 | if self.knowledge.is_forbidden(node, x) or self.knowledge.is_forbidden(x, node): 425 | continue 426 | # again, what's the point? 427 | if not self.valid_set_by_knowledge(node, set()): 428 | continue 429 | 430 | # TODO: Adjacencies 431 | 432 | if (x, node) in self.removed_edges: 433 | continue 434 | 435 | self.calculate_arrows_forward(x, node) 436 | 437 | def initialize_forward_edges_from_empty_graph(self): 438 | """ 439 | Initializes the state of the graph before executing fes() 440 | This is called from search(). 441 | 442 | TODO: 443 | - This seems easily parallelizable 444 | - There is a check for symmetricFirstStep here, which essentially 445 | adds the bump between child <-> parent instead of just parent <-> child. 446 | - This code also checks for boundGraph, which directly enforces 447 | what kind of edges can be `bound`. In effect, this is a type of background knowledge. 448 | 449 | Unknowns: 450 | - Confused by the same-reference emptySet() in the Java implementation for Arrow. Does that 451 | mean that if one gets modified, all will? 452 | """ 453 | for i in range(len(self.variables)): 454 | self.stored_neighbors[self.variables[i]] = set() 455 | for j in range(i + 1, len(self.variables)): 456 | if self.knowledge is not None: 457 | if self.knowledge.is_forbidden(self.variables[i], self.variables[j]) and self.knowledge.is_forbidden(self.variables[j], self.variables[i]): 458 | continue 459 | # literally don't know the point of these next 2 lines 460 | # because valid_set_by_knowledge on the empty set should 461 | # always return True, but it's in Tetrad... 462 | if not self.valid_set_by_knowledge(self.variables[i], set()): 463 | continue 464 | bump = self.score.local_score_diff(self.variables[j], self.variables[i]) 465 | if self.verbose: 466 | print("Evaluated starting arrow " + str(self.variables[j]) + " -> " + str( 467 | self.variables[i]) + " with bump: " + str(bump)) 468 | if bump > 0: 469 | self.mark_nonzero_effect(self.variables[i], self.variables[j]) 470 | parent_node = self.variables[j] 471 | child_node = self.variables[i] 472 | self.add_arrow(parent_node, child_node, set(), set(), bump) 473 | self.add_arrow(child_node, parent_node, set(), set(), bump) 474 | if self.verbose: 475 | print("Initialized forward edges from empty graph") 476 | 477 | def mark_nonzero_effect(self, node_1, node_2): 478 | """ 479 | Adds node_1 to the (instance-wide) effect edges list for node_2, 480 | and vice versa. 481 | """ 482 | if self.effect_edges_graph.get(node_1) is None: 483 | self.effect_edges_graph[node_1] = [node_2] 484 | else: 485 | self.effect_edges_graph[node_1].append(node_2) 486 | 487 | if self.effect_edges_graph.get(node_2) is None: 488 | self.effect_edges_graph[node_2] = [node_1] 489 | else: 490 | self.effect_edges_graph[node_2].append(node_1) 491 | 492 | def insert_eval(self, x, y, T, na_y_x): 493 | """Evaluates bump for adding edge x->y given conditioning sets T and na_y_x""" 494 | assert (x is not y) 495 | _na_y_x = set(na_y_x) 496 | _na_y_x.update(T) 497 | _na_y_x.update(graph_util.get_parents(self.graph, y)) 498 | return self.score_graph_change(y, _na_y_x, x) 499 | 500 | def insert(self, x, y, T, bump): 501 | """ T is a subset of the neighbors of Y that are not adjacent to 502 | (connected by a directed or undirected edge) to X, this should 503 | connect X -> Y and for t \in T, direct T -> Y if it's not already 504 | directed 505 | 506 | Definition 12 507 | 508 | """ 509 | if self.verbose: 510 | print("Doing an actual insertion with " + str(x) + " -> " + str( 511 | y) + " with T: " + str(T) + " and bump: " + str(bump)) 512 | 513 | if graph_util.adjacent(self.graph, x, y): 514 | return False 515 | 516 | # Adds directed edge 517 | self.graph.add_edge(x, y) 518 | 519 | for node in T: 520 | graph_util.undir_to_dir(self.graph, node, y) 521 | 522 | return True 523 | 524 | def delete(self, x, y, H): 525 | # Remove any edge between x and y 526 | graph_util.remove_dir_edge(self.graph, x, y) 527 | graph_util.remove_dir_edge(self.graph, y, x) 528 | 529 | # H is the set of neighbors of y that are adjacent to x 530 | for node in H: 531 | if (graph_util.has_dir_edge(self.graph, node, y) 532 | or graph_util.has_dir_edge(self.graph, node, x)): 533 | continue 534 | 535 | # Direct the edge y --- node as y --> node 536 | graph_util.undir_to_dir(self.graph, y, node) 537 | 538 | # If x --- node is undirected, direct it as x --> node 539 | if graph_util.has_undir_edge(self.graph, x, node): 540 | graph_util.undir_to_dir(self.graph, x, node) 541 | 542 | self.removed_edges.add((x, y)) 543 | 544 | def add_arrow(self, a, b, na_y_x, h_or_t, bump): 545 | """Add arrow a->b with bump "bump" and conditioning sets na_y_x and h_or_t to sorted arrows list""" 546 | # print("Added arrow: " + str(a) + " -> " + str(b) + " with bump " + \ 547 | # str(bump) + " and na_y_x " + str(na_y_x) + " and h_or_t " + str(h_or_t)) 548 | arrow = Arrow(a, b, na_y_x, h_or_t, bump, self.arrow_index) 549 | self.sorted_arrows.add(arrow) 550 | 551 | pair = (a, b) 552 | if self.arrow_dict.get(pair) is None: 553 | self.arrow_dict[pair] = [arrow] 554 | else: 555 | self.arrow_dict[pair].append(arrow) 556 | 557 | self.arrow_index += 1 558 | 559 | def clear_arrow(self, a, b): 560 | """Remove arrow a->b from sorted arrows list""" 561 | pair = (a, b) 562 | # print("Clearing arrow " + str(pair)) 563 | lookup_arrows = self.arrow_dict.get(pair) 564 | # print(lookup_arrows) 565 | if lookup_arrows is not None: 566 | for arrow in lookup_arrows: 567 | # print("Removing " + str(arrow) + " from sorted_arrows") 568 | self.sorted_arrows.discard(arrow) 569 | 570 | self.arrow_dict[pair] = None 571 | 572 | def score_graph_change(self, y, parents, x): 573 | """Evaluate change in score from adding x->y""" 574 | assert (x is not y) 575 | assert (y not in parents) 576 | y_index = y 577 | 578 | parent_indices = list() 579 | for parent_node in parents: 580 | parent_indices.append(parent_node) 581 | 582 | return self.score.local_score_diff_parents(x, y_index, parent_indices) 583 | 584 | def calculate_arrows_forward(self, a, b): 585 | # print("Calculate Arrows Forward: " + str(a) + " " + str(b)) 586 | if b not in self.effect_edges_graph[a] and self.mode == "heuristic": 587 | print("Returning early...") 588 | return 589 | 590 | if self.knowledge is not None and self.knowledge.is_forbidden(a, b): 591 | return 592 | 593 | # print("Get neighbors for " + str(b) + " returns " + str(graph_util.neighbors(self.graph, b))) 594 | 595 | self.stored_neighbors[b] = graph_util.neighbors(self.graph, b) 596 | 597 | na_y_x = graph_util.get_na_y_x(self.graph, a, b) 598 | _na_y_x = list(na_y_x) 599 | 600 | if not graph_util.is_clique(self.graph, na_y_x): 601 | return 602 | 603 | t_neighbors = list(graph_util.get_t_neighbors(self.graph, a, b)) 604 | # print("tneighbors for " + str(a) + ", " + str(b) + " returns " + str(t_neighbors)) 605 | len_T = len(t_neighbors) 606 | 607 | def outer_loop(): 608 | previous_cliques = set() # set of sets of nodes 609 | previous_cliques.add(frozenset()) 610 | new_cliques = set() # set of sets of nodes 611 | for i in range(len_T + 1): 612 | 613 | choices = itertools.combinations(range(len_T), i) 614 | choices2 = itertools.combinations(range(len_T), i) 615 | # print("All choices: ", list(choices2), " TNeighbors: ", t_neighbors) 616 | for choice in choices: 617 | T = frozenset([t_neighbors[k] for k in choice]) 618 | # print("Choice:", T) 619 | union = set(na_y_x) 620 | union.update(T) 621 | 622 | found_a_previous_clique = False 623 | 624 | for clique in previous_cliques: 625 | # basically if clique is a subset of union 626 | if union >= clique: 627 | found_a_previous_clique = True 628 | break 629 | 630 | if not found_a_previous_clique: 631 | # Break out of the outer for loop 632 | return 633 | 634 | if not graph_util.is_clique(self.graph, union): 635 | continue 636 | 637 | new_cliques.add(frozenset(union)) 638 | 639 | bump = self.insert_eval(a, b, T, na_y_x) 640 | # print("Evaluated arrow " + str(a) + " -> " + str(b) + " with T: " + str(T) + " and bump: " + str(bump)); 641 | 642 | if bump > 0: 643 | self.add_arrow(a, b, na_y_x, T, bump) 644 | 645 | previous_cliques = new_cliques 646 | new_cliques = set() 647 | 648 | outer_loop() 649 | 650 | def valid_set_by_knowledge(self, x, subset): 651 | """Use knowledge to decide if an insert of delete does not orient edges 652 | in a forbidden way. If some orientation in the subset is forbidden, 653 | the whole subset is forbidden""" 654 | for node in subset: 655 | if self.knowledge.is_forbidden(x, node): 656 | return False 657 | return True 658 | 659 | def create_checkpoint(self): 660 | with open(self.save_name + '-checkpoint.pkl', 'wb') as f: 661 | dill.dump(self, f, dill.HIGHEST_PROTOCOL) 662 | -------------------------------------------------------------------------------- /graph_util.py: -------------------------------------------------------------------------------- 1 | """ 2 | Graph Terminology 3 | ----------------- 4 | * DAG: Directed Acyclic Graph 5 | * PDAG: Partially Directed Acyclic Graph 6 | * Directed edge: x --> y 7 | * Undirected edge: x --- y is represented as the pair x --> y and y --> x 8 | * Parents(x): nodes y such that there is a directed edge y --> x 9 | * Neighbors(x): nodes y such that there is an undirected edge y --- x 10 | * Adjacents(x): nodes y such there is some edge between x and y 11 | (i.e. x --- y, x --> y, or x <-- y) 12 | * Directed path: A path of entirely directed edges in the same direction 13 | * Ancestors(x): nodes y such that there is a directed path y ~~> x 14 | * Unshielded collider: triple of vertices x, y, z with directed edges 15 | x --> y <-- z, and x and z are not adjacent 16 | * Semi-directed path: A path of directed and undirected edges, where no 17 | directed edge is going in the opposite direction 18 | """ 19 | 20 | import queue 21 | import networkx as nx 22 | import itertools 23 | 24 | def add_undir_edge(g, x, y): 25 | """Adds an undirected edge (x,y) to Graph g. 26 | Undirected edges are stores as pairs of directed edges (x,y) and (y,x)""" 27 | g.add_edge(x, y) 28 | g.add_edge(y, x) 29 | 30 | def add_dir_edge(g, x, y): 31 | """Adds an directed edge (x,y) to Graph g.""" 32 | g.add_edge(x, y) 33 | 34 | def undir_to_dir(g, x, y): 35 | """ Keep only x --> y """ 36 | if g.has_edge(y, x) and g.has_edge(x, y): 37 | # Current edge is x --- y 38 | g.remove_edge(y, x) 39 | # print("Directing " + str(x) + " -> " + str(y)) 40 | elif g.has_edge(x, y): 41 | # Current edge is x --> y 42 | pass 43 | # print("No-op Directing " + str(x) + " -> " + str(y)) 44 | elif g.has_edge(y, x): 45 | # Current edge is y --> x 46 | raise AssertionError("undir_to_dir: trying to reverse a directed edge") 47 | else: 48 | raise AssertionError("undir_to_dir: no such edge") 49 | 50 | def get_parents(g, x): 51 | """Returns immediate parents of node x in graph g""" 52 | parents = [] 53 | for node in adjacent_nodes(g, x): 54 | if has_dir_edge(g, node, x): 55 | parents.append(node) 56 | return parents 57 | 58 | def get_ancestors(g, x, accum=None): 59 | """Returns all ancestors of a node x in graph g""" 60 | if accum is None: 61 | accum = set() 62 | if x in accum: 63 | return accum 64 | 65 | accum.add(x) 66 | parents = get_parents(g, x) 67 | for p in parents: 68 | accum = get_ancestors(g, p, accum) 69 | 70 | return accum 71 | 72 | def has_undir_edge(g, x, y): 73 | """ Returns whether there is an undirected edge from x to y in Graph g """ 74 | return g.has_edge(x, y) and g.has_edge(y, x) 75 | 76 | 77 | def has_dir_edge(g, x, y): 78 | """Returns whether there is a directed edge from x to y in Graph g""" 79 | return g.has_edge(x, y) and not g.has_edge(y, x) 80 | 81 | 82 | def is_unshielded_non_collider(g, node_a, node_b, node_c): 83 | """Returns whether nodes a,b,c form an unshielded non-coliding triple""" 84 | if (not adjacent(g, node_a, node_b)): 85 | return False 86 | 87 | if (not adjacent(g, node_c, node_b)): 88 | return False 89 | 90 | if (adjacent(g, node_a, node_c)): 91 | return False 92 | 93 | if (is_ambiguous_triple(g, node_a, node_b, node_c)): 94 | return False 95 | 96 | return not (has_dir_edge(g, node_a, node_b) and has_dir_edge(g, node_c, node_b)) 97 | 98 | def is_def_collider(g, node_1, node_2, node_3): 99 | """Returns whether nodes a,b,c form a collider a -> b <- c""" 100 | return has_dir_edge(g, node_1, node_2) and has_dir_edge(g, node_3, node_2) 101 | 102 | def is_unshielded_collider(g, node_1, node_2, node_3): 103 | """Returns whether nodes a,b,c form an unshielded collider a -> b <- c""" 104 | return has_dir_edge(g, node_1, node_2) and has_dir_edge(g, node_3, node_2) and not adjacent(g, node_1, node_3) 105 | 106 | def check_for_colliders(g, n): 107 | """Searches for an unshielded collider a -> n <- b""" 108 | adj = [m for m in g.nodes() if has_dir_edge(g, m, n)] 109 | new_colliders = set() 110 | 111 | for pair in itertools.combinations(adj, 2): 112 | if is_unshielded_collider(g, pair[0], n, pair[1]): 113 | new_colliders.add((pair[0], n, pair[1])) 114 | 115 | return new_colliders 116 | 117 | def get_all_collider_triples(g): 118 | """Returns set of all collider triples in a Graph g""" 119 | colliders = [check_for_colliders(g, n) for n in g.nodes()] 120 | return set.union(*colliders) 121 | 122 | def is_ambiguous_triple(g, node_a, node_b, node_c): 123 | # TODO: Actually write this. I'm having a tough time finding 124 | # where this logic is implemented, because it seems like 125 | # ambiguous triples is not populated for an EdgeListGraph that is 126 | # populated with just a Lists 127 | return False 128 | 129 | def traverseSemiDirected(g, x, y): 130 | """Returns y if there is a directed """ 131 | if has_undir_edge(g, x, y) or g.has_edge(x, y): 132 | return y 133 | return None 134 | 135 | def adjacent(g, x, y): 136 | """ Returns whether nodes x and y are adjacent """ 137 | return g.has_edge(x, y) or g.has_edge(y, x) 138 | 139 | def undir_edge_neighbors(g, x, y): 140 | """Alias for has_undir_edge""" 141 | return has_undir_edge(g, x, y) 142 | 143 | def adjacent_nodes(g, x): 144 | """Returns all adjacent nodes to x in Graph g""" 145 | return list(set(nx.all_neighbors(g, x))) 146 | 147 | def neighbors(g, x): 148 | """Returns all neighbors of x in Graph g. 149 | A neighbor is an adjacent node that """ 150 | potentialNeighbors = nx.all_neighbors(g, x) 151 | resulting_neighbors = set({}) 152 | for pNode in potentialNeighbors: 153 | if undir_edge_neighbors(g, x, pNode): 154 | resulting_neighbors.add(pNode) 155 | 156 | return resulting_neighbors 157 | 158 | def get_na_y_x(g, x, y): 159 | """Gets possible conditioning sets of nodes to consider for P(Y|X)""" 160 | na_y_x = [] 161 | all_y_neighbors = set(nx.all_neighbors(g, y)) 162 | 163 | for z in all_y_neighbors: 164 | if has_undir_edge(g, z, y): 165 | if adjacent(g, z, x): 166 | na_y_x.append(z) 167 | 168 | return set(na_y_x) 169 | 170 | def is_clique(g, node_set): 171 | """Checks to see if the nodes in node_set form a clique""" 172 | for node in node_set: 173 | for other_node in node_set: 174 | if node != other_node and not adjacent(g, node, other_node): 175 | return False 176 | return True 177 | 178 | def get_t_neighbors(g, x, y): 179 | """Returns possible members of conditioning set for x---y edge consideration""" 180 | t = set([]) 181 | all_y_neighbors = set(nx.all_neighbors(g, y)) 182 | 183 | for z in all_y_neighbors: 184 | if has_undir_edge(g, z, y): 185 | if adjacent(g, z, x): 186 | continue 187 | t.add(z) 188 | 189 | return t 190 | 191 | def is_kite(g, a, d, b, c): 192 | """ 193 | Returns if nodes a,b,c, and d form a kite 194 | D --- B, D --- A, D --- C, B --> A <-- C 195 | See Meek (1995) Rule 3 196 | """ 197 | return has_undir_edge(g, d, a) and \ 198 | has_undir_edge(g, d, b) and \ 199 | has_undir_edge(g, d, c) and \ 200 | has_dir_edge(g, b, a) and \ 201 | has_dir_edge(g, c, a) 202 | 203 | def get_common_adjacents(g, x, y): 204 | """Get the nodes that are adjacent to both x and y""" 205 | return set(adjacent_nodes(g, x)).intersection(set(adjacent_nodes(g, y))) 206 | 207 | def remove_dir_edge(g, x, y): 208 | """Removes the directed edge x --> y""" 209 | if g.has_edge(x, y): 210 | g.remove_edge(x, y) 211 | 212 | def exists_unblocked_semi_directed_path(g, origin, dest, cond_set, bound): 213 | """Checks if there exists a unblocked semi directed path (that is, there could be a possible path) from 214 | origin to dest, while conditioning on cond_set""" 215 | if bound == -1: 216 | bound = 1000 217 | 218 | q = queue.Queue() 219 | v = set() 220 | q.put(origin) 221 | v.add(origin) 222 | 223 | e = None 224 | distance = 0 225 | 226 | while not q.empty(): 227 | t = q.get() 228 | if t == dest: 229 | return True 230 | 231 | if e == t: 232 | e = None 233 | distance += 1 234 | if distance > bound: 235 | return False 236 | 237 | for u in set(nx.all_neighbors(g, t)): 238 | c = traverseSemiDirected(g, t, u) 239 | if c is None: 240 | continue 241 | 242 | if c in cond_set: 243 | continue 244 | 245 | if c == dest: 246 | return True 247 | 248 | if not c in v: 249 | v.add(c) 250 | q.put(c) 251 | 252 | if e == None: 253 | e = c 254 | return False 255 | 256 | def detect_cycle_at_node(graph, node): 257 | '''Detect a cycle involving a specific node''' 258 | q = queue.Queue() 259 | visited = set() 260 | q.put(node) 261 | 262 | while not q.empty(): 263 | t = q.get() 264 | for child in graph.neighbors(t): 265 | if has_dir_edge(graph, t, child): 266 | if child == node: 267 | return True 268 | elif child not in visited: 269 | q.put(child) 270 | visited.add(t) 271 | 272 | return False 273 | 274 | def detect_cycle(graph): 275 | '''Detect a cycle by finding directed loop.''' 276 | for n in graph.nodes(): 277 | if detect_cycle_at_node(graph, n): 278 | return True 279 | return False 280 | -------------------------------------------------------------------------------- /knowledge.py: -------------------------------------------------------------------------------- 1 | """ 2 | knowledge.py 3 | 4 | Description from Tetrad 5 | 6 | Stores information about required and forbidden edges and common causes for 7 | use in algorithm. This information can be set edge by edge or else globally 8 | via temporal tiers. When setting temporal tiers, all edges from later tiers 9 | to earlier tiers are forbidden. 10 | 11 | For this class, all variable names are referenced by name only. This is 12 | because the same Knowledge object is intended to plug into different graphs 13 | with MyNodes that possibly have the same names. Thus, if the Knowledge object 14 | forbids the edge X --> Y, then it forbids any edge which connects a MyNode 15 | named "X" to a MyNode named "Y", even if the underlying MyNodes themselves 16 | named "X" and "Y", respectively, are not the same. 17 | """ 18 | import graph_util 19 | 20 | class Knowledge: 21 | def __init__(self): 22 | self.required_edges = set() 23 | self.forbidden_edges = set() 24 | self.required_connections = set() 25 | self.tier_map = {} 26 | self.forbidden_within_tiers = {} 27 | 28 | def set_forbidden(self, x, y): 29 | self.forbidden_edges.add((x, y)) 30 | 31 | def remove_forbidden(self, x, y): 32 | self.forbidden_edges -= {(x, y)} 33 | 34 | def set_required(self, x, y): 35 | self.required_edges.add((x, y)) 36 | 37 | def remove_required(self, x, y): 38 | self.required_edges -= {(x, y)} 39 | 40 | def set_required_connection(self, x, y): 41 | self.required_connections.add((x, y)) 42 | 43 | def remove_required_connection(self, x, y): 44 | self.required_connections -= {(x, y)} 45 | 46 | def set_tier(self, node, tier): 47 | self.tier_map[node] = tier 48 | 49 | def is_forbidden_by_tiers(self, x, y): 50 | if not x in self.tier_map.keys() or not y in self.tier_map.keys(): 51 | return False 52 | if self.tier_map[x] == self.tier_map[y]: 53 | return self.forbidden_within_tiers[x] == self.forbidden_within_tiers[y] 54 | return self.tier_map[x] > self.tier_map[y] 55 | 56 | def set_tier_forbidden_within(self, tier, forbidden): 57 | self.forbidden_within_tiers[tier] = forbidden 58 | 59 | def is_forbidden(self, x, y): 60 | if self.is_forbidden_by_tiers(x, y): 61 | return True 62 | else: 63 | return (x, y) in self.forbidden_edges 64 | 65 | def no_edge_required(self, x, y): 66 | return not (self.is_required(x, y) or self.is_required(y, x) or 67 | (x, y) in self.required_connections or 68 | (y, x) in self.required_connections) 69 | 70 | def is_required(self, x, y): 71 | return (x, y) in self.required_edges 72 | 73 | def is_violated_by(self, graph): 74 | for edge in self.required_edges: 75 | if not graph_util.has_dir_edge(graph, edge[0], edge[1]): 76 | return True 77 | 78 | for edge in graph.edges: 79 | if graph_util.has_undir_edge(graph, edge[0], edge[1]): 80 | continue 81 | 82 | if self.is_forbidden(edge[0], edge[1]): 83 | return True 84 | 85 | return False -------------------------------------------------------------------------------- /meekrules.py: -------------------------------------------------------------------------------- 1 | import graph_util 2 | import itertools 3 | 4 | 5 | class MeekRules: 6 | __slots__ = ['undirect_unforced_edges', 'init_nodes', 'node_subset', 7 | 'visited', 'direct_stack', 'oriented', 'knowledge'] 8 | 9 | def __init__(self, undirect_unforced_edges=True, knowledge=None): 10 | # Unforced parents should be undirected before orienting 11 | self.undirect_unforced_edges = undirect_unforced_edges 12 | self.init_nodes = [] 13 | self.node_subset = {} 14 | self.visited = set() 15 | self.direct_stack = [] 16 | self.oriented = set() 17 | self.knowledge = knowledge 18 | 19 | def orient_implied_subset(self, graph, node_subset): 20 | self.node_subset = node_subset 21 | self.visited.update(node_subset) 22 | self.orient_using_meek_rules_locally(graph) 23 | 24 | def orient_implied(self, graph): 25 | self.orient_implied_subset(graph, graph.nodes()) 26 | 27 | def orient_using_meek_rules_locally(self, graph): 28 | """Orient graph using the four Meek rules""" 29 | if self.undirect_unforced_edges: 30 | for node in self.node_subset: 31 | self.undirect_unforced_edges_func(node, graph) 32 | self.direct_stack.extend( 33 | graph_util.adjacent_nodes(graph, node)) 34 | 35 | # TODO: Combine loops 36 | for node in self.node_subset: 37 | self.run_meek_rules(node, graph) 38 | if self.direct_stack != []: 39 | last_node = self.direct_stack.pop() 40 | else: 41 | last_node = None 42 | 43 | while last_node is not None: 44 | # print(last_node) 45 | if self.undirect_unforced_edges: 46 | self.undirect_unforced_edges_func(last_node, graph) 47 | 48 | self.run_meek_rules(last_node, graph) 49 | # print("past run_meek_rules") 50 | if len(self.direct_stack) > 0: 51 | last_node = self.direct_stack.pop() 52 | else: 53 | last_node = None 54 | 55 | def undirect_unforced_edges_func(self, node, graph): 56 | """Removes directed edges that are not forced by an unshielded collider about node""" 57 | node_parents = graph_util.get_parents(graph, node) 58 | parents_to_undirect = set(node_parents) 59 | 60 | # Find any unshielded colliders in node_parents, and orient them 61 | for (p1, p2) in itertools.combinations(node_parents, 2): 62 | if not graph_util.adjacent(graph, p1, p2): 63 | # Have an unshielded collider p1 -> node <- p2, which forces orientation 64 | self.oriented.update([(p1, node), (p2, node)]) 65 | parents_to_undirect.difference_update([p1, p2]) 66 | 67 | did_unorient = False 68 | 69 | for parent in parents_to_undirect: 70 | if self.knowledge is not None: 71 | must_orient = self.knowledge.is_required(parent, node) or \ 72 | self.knowledge.is_forbidden(node, parent) 73 | else: 74 | must_orient = False 75 | if not (parent, node) in self.oriented and not must_orient: 76 | # Undirect parent -> node 77 | graph_util.remove_dir_edge(graph, parent, node) 78 | graph_util.add_undir_edge(graph, parent, node) 79 | self.visited.add(node) 80 | self.visited.add(parent) 81 | # print(f"unorienting {parent} -> {node}") 82 | did_unorient = True 83 | 84 | if did_unorient: 85 | for adjacent in graph_util.adjacent_nodes(graph, node): 86 | self.direct_stack.append(adjacent) 87 | 88 | self.direct_stack.append(node) 89 | 90 | def run_meek_rules(self, node, graph): 91 | self.run_meek_rule_one(node, graph) 92 | self.run_meek_rule_two(node, graph) 93 | self.run_meek_rule_three(node, graph) 94 | self.run_meek_rule_four(node, graph) 95 | 96 | def run_meek_rule_one(self, node, graph): 97 | """ 98 | Meek's rule R1: if a-->b, b---c, and a not adj to c, then a-->c 99 | """ 100 | # print("Running meek rule one", node) 101 | adjacencies = graph_util.adjacent_nodes(graph, node) 102 | if len(adjacencies) < 2: 103 | return 104 | all_combinations = itertools.combinations( 105 | range(0, len(adjacencies)), 2) 106 | for (index_one, index_two) in all_combinations: 107 | node_a = adjacencies[index_one] 108 | node_c = adjacencies[index_two] 109 | 110 | # TODO: Parallelize these flipped versions? 111 | self.r1_helper(node_a, node, node_c, graph) 112 | self.r1_helper(node_c, node, node_a, graph) 113 | 114 | def r1_helper(self, node_a, node_b, node_c, graph): 115 | if ((not graph_util.adjacent(graph, node_a, node_c)) and 116 | (graph_util.has_dir_edge(graph, node_a, node_b) or (node_a, node_b) in self.oriented) and 117 | graph_util.has_undir_edge(graph, node_b, node_c)): 118 | if not graph_util.is_unshielded_non_collider(graph, node_a, node_b, node_c): 119 | return 120 | 121 | if self.is_arrowpoint_allowed(node_b, node_c): 122 | # print("R1: " + str(node_b) + " " + str(node_c)) 123 | if (node_a, node_c) not in self.oriented and (node_c, node_a) not in self.oriented and \ 124 | (node_b, node_c) not in self.oriented and (node_c, node_b) not in self.oriented: 125 | self.direct(node_b, node_c, graph) 126 | 127 | def direct(self, node_1, node_2, graph): 128 | # print("Int Directing " + str(node_1) + " " + str(node_2)) 129 | if self.knowledge is not None: 130 | if self.knowledge.is_forbidden(node_1, node_2): 131 | return 132 | 133 | graph_util.remove_dir_edge(graph, node_1, node_2) 134 | graph_util.remove_dir_edge(graph, node_2, node_1) 135 | graph_util.add_dir_edge(graph, node_1, node_2) 136 | self.visited.update([node_1, node_2]) 137 | # node_1 -> node_2 edge 138 | if (node_1, node_2) not in self.oriented and \ 139 | (node_2, node_1) not in self.oriented: 140 | self.oriented.add((node_1, node_2)) 141 | self.direct_stack.append(node_2) 142 | 143 | def run_meek_rule_two(self, node_b, graph): 144 | # print("Running meek rule two", node_b) 145 | adjacencies = graph_util.adjacent_nodes(graph, node_b) 146 | if len(adjacencies) < 2: 147 | return 148 | all_combinations = itertools.combinations( 149 | range(0, len(adjacencies)), 2) 150 | for (index_one, index_two) in all_combinations: 151 | node_a = adjacencies[index_one] 152 | node_c = adjacencies[index_two] 153 | self.r2_helper(node_a, node_b, node_c, graph) 154 | self.r2_helper(node_b, node_a, node_c, graph) 155 | self.r2_helper(node_a, node_c, node_b, graph) 156 | self.r2_helper(node_c, node_a, node_b, graph) 157 | 158 | def r2_helper(self, a, b, c, graph): 159 | if graph_util.has_dir_edge(graph, a, b) and \ 160 | graph_util.has_dir_edge(graph, b, c) and \ 161 | graph_util.has_undir_edge(graph, a, c): 162 | if self.is_arrowpoint_allowed(a, c): 163 | self.direct(a, c, graph) 164 | 165 | def run_meek_rule_three(self, node, graph): 166 | """ 167 | A --- B, A --- X, A --- C, B --> X <-- C, B -/- C => A --> X 168 | The parameter node = X 169 | """ 170 | # print("Running meek rule three", node) 171 | adjacencies = graph_util.adjacent_nodes(graph, node) 172 | 173 | if len(adjacencies) < 3: 174 | return 175 | 176 | for node_a in adjacencies: 177 | if graph_util.has_undir_edge(graph, node, node_a): 178 | copy_adjacencies = [a for a in adjacencies if a != node_a] 179 | all_combinations = itertools.combinations(copy_adjacencies, 2) 180 | 181 | for node_b, node_c in all_combinations: 182 | if graph_util.is_kite(graph, node, node_a, node_b, node_c) and \ 183 | self.is_arrowpoint_allowed(node_a, node) and \ 184 | graph_util.is_unshielded_non_collider(graph, node_c, node_a, node_b): 185 | # print("R3: " + str(node_a) + " " + str(node)) 186 | self.direct(node_a, node, graph) 187 | 188 | def run_meek_rule_four(self, a, graph): 189 | if self.knowledge is None: 190 | return 191 | 192 | adjacent_nodes = graph_util.adjacent_nodes(graph, a) 193 | 194 | for (b, c, d) in itertools.permutations(adjacent_nodes, 3): 195 | if (graph_util.has_undir_edge(graph, a, b) and 196 | graph_util.has_dir_edge(graph, b, c) and 197 | graph_util.has_dir_edge(graph, c, d) and 198 | graph_util.has_undir_edge(graph, d, a) and 199 | self.is_arrowpoint_allowed(a, d)): 200 | self.direct(a, d, graph) 201 | 202 | def is_arrowpoint_allowed(self, from_node, to_node): 203 | if self.knowledge is None: 204 | return True 205 | 206 | return not self.knowledge.is_required(to_node, from_node) and \ 207 | not self.knowledge.is_forbidden(from_node, to_node) 208 | 209 | def get_visited(self): 210 | """ This is what FGES actually uses """ 211 | return self.visited 212 | -------------------------------------------------------------------------------- /runner.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from SEMScore import * 3 | from fges import * 4 | import time 5 | import sys 6 | 7 | import pickle 8 | import argparse 9 | 10 | parser = argparse.ArgumentParser(description="Run FGES.") 11 | parser.add_argument("dataset", type=str, 12 | help="File to load data from (text file with a " \ 13 | "row for each datapoint and a column for each variable. \ 14 | If name of file ends in -checkpoint, this is assumed to be \ 15 | a saved checkpoint instead") 16 | parser.add_argument("save_name", type=str, help="File to save output to.") 17 | 18 | parser.add_argument("sparsity", type=float, help="Sparsity penalty to use.") 19 | 20 | parser.add_argument("-c", "--checkpoint", action="store_true", 21 | help="dataset is a FGES pickled checkpoint.") 22 | parser.add_argument("--checkpoint_frequency", type=int, default=0, 23 | help="Frequency to checkpoint work (in seconds). \ 24 | Defaults to 0 to turn off checkpointing.") 25 | 26 | def load_file(data_file): 27 | return np.loadtxt(data_file, skiprows = 1) 28 | 29 | def main(): 30 | args = parser.parse_args() 31 | if args.dataset[-15:] == "-checkpoint.pkl": 32 | start_time = time.time() 33 | fges = FGES.load_checkpoint(args.dataset) 34 | fges.last_checkpoint = time.time() 35 | result = fges.search(checkpoint=True) 36 | else: 37 | dataset = load_file(args.dataset) 38 | score = SEMBicScore(args.sparsity, dataset=dataset) # Initialize SEMBic Object 39 | variables = list(range(len(dataset[0]))) 40 | print("Running FGES on graph with " + str(len(variables)) + " nodes.") 41 | fges = FGES(variables, score, 42 | filename=args.dataset, 43 | checkpoint_frequency=args.checkpoint_frequency, 44 | save_name=args.save_name) 45 | start_time = time.time() 46 | result = fges.search() 47 | 48 | print("--- %s seconds ---" % (time.time() - start_time)) 49 | with open(args.save_name + '.pkl', 'wb') as f: 50 | pickle.dump(result, f, pickle.HIGHEST_PROTOCOL) 51 | 52 | if __name__ == "__main__": 53 | main() 54 | -------------------------------------------------------------------------------- /search_util.py: -------------------------------------------------------------------------------- 1 | 2 | import networkx as nx 3 | 4 | from meekrules import MeekRules 5 | from graph_util import * 6 | import numpy as np 7 | import queue 8 | 9 | def get_undir_edge(g): 10 | '''Find an undirected edge in Graph g, or None if none exist''' 11 | for (x, y) in g.edges(): 12 | if has_undir_edge(g, x, y): 13 | return (x, y) 14 | return None 15 | 16 | def dagFromPattern(graph): 17 | ''' 18 | Construct a specific graph from an equivalence class 19 | :param graph: Equivalence class (i.e. DAG with unoriented edges) 20 | :return: Candidate dag, or None if unsuccessful 21 | ''' 22 | 23 | dag = graph.copy() 24 | graph_colliders = get_all_collider_triples(graph) 25 | rules = MeekRules(undirect_unforced_edges=False) 26 | 27 | if detect_cycle(dag): 28 | return None 29 | 30 | def check_graph(dag, node): 31 | ''' 32 | Check if a dag is okay. 33 | :param dag: dag to check 34 | :param node: node to check for cycles 35 | :return: dag with implied edges if valid, else None 36 | ''' 37 | rules.orient_implied(dag) 38 | new_colliders = get_all_collider_triples(dag) 39 | if new_colliders == graph_colliders and not detect_cycle_at_node(dag, node): 40 | return dag 41 | else: 42 | return None 43 | 44 | def try_to_solve(pattern): 45 | ''' 46 | Try to find a fully oriented dag from a pattern using a DFS 47 | :param pattern: the pattern to try 48 | :return: dag if successful, else None 49 | ''' 50 | if pattern is None: 51 | return None 52 | 53 | edge = get_undir_edge(pattern) 54 | 55 | if edge is None: 56 | # No more undirected edges 57 | return pattern 58 | 59 | (node1, node2) = edge 60 | new_g = pattern.copy() 61 | if node2 not in get_ancestors(new_g, node1): 62 | # Orient edge node1 -> node2 63 | new_g.remove_edge(node2, node1) 64 | result = try_to_solve(check_graph(new_g, node1)) 65 | if result is not None: 66 | return result 67 | 68 | new_g = pattern.copy() 69 | if node1 not in get_ancestors(new_g, node2): 70 | # Orient edge node2 -> node1 71 | new_g.remove_edge(node1, node2) 72 | result = try_to_solve(check_graph(new_g, node2)) 73 | if result is not None: 74 | return result 75 | 76 | return None 77 | 78 | return try_to_solve(graph) 79 | 80 | #TODO: use smarter penalty function than simply a count 81 | def dagFromPatternWithColliders(graph): 82 | ''' 83 | Construct a DAG from the pattern graph that minimizes the number of new colliders added. 84 | :param graph: The pattern to use 85 | :return: DAG 86 | ''' 87 | pattern = graph.copy() 88 | 89 | assert not detect_cycle(pattern), "Pattern must be acyclic to start" 90 | 91 | optimal_graph = None 92 | optimal_penalty = np.inf 93 | 94 | # Stack of (colliders before messing with the edge, 95 | # penalty before messing with the edge, 96 | # edge to mess with, 97 | # status) 98 | history = queue.LifoQueue(maxsize=len(pattern.edges())) 99 | history.put((get_all_collider_triples(pattern), 0, get_undir_edge(pattern), 0)) 100 | 101 | while not history.empty(): 102 | c, p, edge, status = history.get() 103 | 104 | if edge is None: 105 | if p < optimal_penalty: 106 | optimal_penalty = p 107 | optimal_graph = pattern.copy() 108 | continue 109 | 110 | (x, y) = edge 111 | 112 | if status == 0: 113 | # Orient x -> y 114 | pattern.remove_edge(y, x) 115 | c1 = check_for_colliders(pattern, y) 116 | p1 = p + len(c1 - c) # set difference 117 | history.put((c, p, edge, 1)) 118 | 119 | if not detect_cycle_at_node(pattern, x) and p1 < optimal_penalty: 120 | history.put((c.union(c1), p1, get_undir_edge(pattern), 0)) 121 | 122 | elif status == 1: 123 | # Orient y -> x 124 | pattern.add_edge(y, x) 125 | pattern.remove_edge(x, y) 126 | c1 = check_for_colliders(pattern, x) 127 | p1 = p + len(c1 - c) 128 | history.put((c, p, edge, 2)) 129 | 130 | if not detect_cycle_at_node(pattern, y) and p1 < optimal_penalty: 131 | history.put((c.union(c1), p1, get_undir_edge(pattern), 0)) 132 | 133 | elif status == 2: 134 | pattern.add_edge(x, y) 135 | 136 | assert optimal_graph is not None 137 | 138 | return (optimal_graph, optimal_penalty) 139 | 140 | 141 | def mean_shift_data(data): 142 | '''Shift all variables in a dataset to have mean zero''' 143 | return data - np.mean(data, axis=0) 144 | 145 | def estimate_parameters(dag, data): 146 | ''' 147 | Estimate the parameters of a DAG to fit the data. 148 | :return: matrix of edge coefficients, and diagonal matrix of residuals 149 | For the parameters matrix, p[i, j] is the weight of edge i -> j 150 | ''' 151 | 152 | assert get_undir_edge(dag) is None 153 | 154 | data = mean_shift_data(data) 155 | num_nodes = len(dag.nodes()) 156 | 157 | edge_parameters = np.zeros((num_nodes, num_nodes)) 158 | residuals = np.zeros((num_nodes, num_nodes)) 159 | 160 | for j in range(num_nodes): 161 | inbound_nodes = [i for i in range(num_nodes) if has_dir_edge(dag, i, j)] 162 | 163 | if len(inbound_nodes) == 0: 164 | residuals[j, j] = np.var(data[:, j]) 165 | continue 166 | 167 | assert j not in inbound_nodes 168 | 169 | a = data[:, inbound_nodes] 170 | b = data[:, j] 171 | 172 | params, r, _, _ = np.linalg.lstsq(a, b) 173 | 174 | residuals[j, j] = r / (data.shape[0] - 1) 175 | 176 | for i in range(len(inbound_nodes)): 177 | edge_parameters[inbound_nodes[i], j] = params[i] 178 | # v = edge_parameters * v + e 179 | 180 | return np.array(edge_parameters), np.array(residuals) 181 | 182 | def get_covariance_matrix(params, resids): 183 | ''' 184 | Get the covariance matrix from edge parameters 185 | (representing a DAG) and the residuals. 186 | 187 | For the equation, see "Causal Mapping of Emotion Networks in the Human Brain" (p. 15) 188 | The params matrix is taken with orientation p[i, j] is the weight for edge i -> j 189 | ''' 190 | id = np.identity(params.shape[0]) 191 | a = np.linalg.inv(id - params.transpose()) 192 | 193 | return np.matmul(np.matmul(a, resids), np.transpose(a)) -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eberharf/fges-py/961188a48b8689ae451861a7232262adffb46d45/tests/__init__.py -------------------------------------------------------------------------------- /tests/fges_tests.py: -------------------------------------------------------------------------------- 1 | from SEMScore import * 2 | from fges import * 3 | from tests.test_util import * 4 | import unittest 5 | import random 6 | 7 | def run_fges_file(data_file, **kwargs): 8 | ''' 9 | Run FGES on a data file, returning the resulting graph 10 | :param data_file: the data file to use 11 | :return: DiGraph from fges.search() 12 | ''' 13 | return run_fges_array(np.loadtxt(data_file, skiprows = 1), **kwargs) 14 | 15 | def run_fges_array(dataset, **kwargs): 16 | ''' 17 | Run FGES on a loaded array, with a row for each datapoint and a column for each variable. 18 | :param dataset: numpy array 19 | :return: DiGraph from fges.search() 20 | ''' 21 | score = SEMBicScore(dataset, 2) # Initialize SEMBic Object 22 | variables = list(range(len(dataset[0]))) 23 | print("Running FGES on graph with " + str(len(variables)) + " nodes.") 24 | fges = FGES(variables, score, **kwargs) 25 | return fges.search() 26 | 27 | def assert_unoriented_edge(edges, e): 28 | assert (e in edges) and (e[::-1] in edges) 29 | 30 | def assert_oriented_edge(edges, e): 31 | assert (e in edges) and not (e[::-1] in edges) 32 | 33 | class SimpleTests(unittest.TestCase): 34 | 35 | def test_collider_1(self): 36 | ''' 37 | Test a simple collider X1 -> X3 <- X2 38 | FGES should obtain the exact graph 39 | ''' 40 | result = run_fges_file("../data/collider_1.txt") 41 | edges = result['graph'].edges() 42 | 43 | assert_oriented_edge(edges, (0, 2)) 44 | assert_oriented_edge(edges, (1, 2)) 45 | 46 | def test_collider_2(self): 47 | ''' 48 | Test a collider with common cause 49 | X1 -> X2 -> X3 50 | X1 -> X4 -> X3 51 | FGES should resolve collider at X3, and connection between other nodes 52 | ''' 53 | result = run_fges_file("../data/collider_2.txt") 54 | edges = result['graph'].edges() 55 | 56 | assert_oriented_edge(edges, (1, 2)) 57 | assert_oriented_edge(edges, (3, 2)) 58 | assert_unoriented_edge(edges, (0, 1)) 59 | assert_unoriented_edge(edges, (0, 3)) 60 | 61 | def test_collider_3(self): 62 | ''' 63 | Graph Edges: 64 | {X0, X1} --> X2 --> {X3, X4} --> X5 65 | 66 | FGES should orient all edges 67 | ''' 68 | result = run_fges_file("../data/collider_3.txt") 69 | edges = result['graph'].edges() 70 | 71 | print("Computed Edges:", edges) 72 | 73 | expected = [(0, 2), (1, 2), (2, 3), (2, 4), (3, 5), (4, 5)] 74 | all_correct = True 75 | 76 | for e in expected: 77 | if e not in edges: 78 | all_correct = False 79 | print("Missing edge", e, "({} -> {})".format(*e)) 80 | 81 | for e in edges: 82 | if e not in expected: 83 | all_correct = False 84 | print("Extra edge", e, "({} -> {})".format(*e)) 85 | 86 | assert all_correct 87 | 88 | def test_collider_4(self): 89 | ''' 90 | Graph Edges: 91 | {X1, X2} --> X3 --> X4 --> X5 92 | 93 | FGES should orient all edges 94 | ''' 95 | result = run_fges_file("../data/collider_4.txt") 96 | edges = result['graph'].edges() 97 | 98 | expected = [(0, 2), (1, 2), (2, 3), (3, 4)] 99 | 100 | for e in expected: 101 | assert_oriented_edge(edges, e) 102 | 103 | assert(len(edges) == len(expected)) 104 | 105 | def test_collider_5(self): 106 | ''' 107 | Graph Edges: 108 | {X1, X2} --> X3; X1 --> X4 109 | 110 | FGES should orient all edges 111 | ''' 112 | result = run_fges_file("../data/collider_5.txt") 113 | edges = result['graph'].edges() 114 | 115 | assert_oriented_edge(edges, (0, 2)) 116 | assert_oriented_edge(edges, (1, 2)) 117 | assert_unoriented_edge(edges, (0, 3)) 118 | 119 | assert(len(edges) == 4) 120 | 121 | def test_linear_1(self): 122 | ''' 123 | X1 --> X2 --> X3 --> X4 124 | 125 | FGES should not be able to orient any edges 126 | ''' 127 | result = run_fges_file("../data/linear_1.txt") 128 | edges = result['graph'].edges() 129 | 130 | assert_unoriented_edge(edges, (0, 1)) 131 | assert_unoriented_edge(edges, (1, 2)) 132 | assert_unoriented_edge(edges, (2, 3)) 133 | 134 | def test_single_edge_1(self): 135 | ''' 136 | Graph with 10 variables and a single edge. 137 | ''' 138 | result = run_fges_file("../data/single_edge_1.txt") 139 | edges = result['graph'].edges() 140 | 141 | assert len(edges) == 2 142 | assert_unoriented_edge(edges, (0, 1)) 143 | 144 | def test_single_edge_2(self): 145 | ''' 146 | Graph with 50 variables and a single edge. 147 | ''' 148 | result = run_fges_file("../data/single_edge_2.txt") 149 | edges = result['graph'].edges() 150 | 151 | assert len(edges) == 2 152 | assert_unoriented_edge(edges, (0, 1)) 153 | 154 | def test_single_edge_3(self): 155 | ''' 156 | Graph with 100 variables and a single edge. 157 | ''' 158 | result = run_fges_file("../data/single_edge_3.txt") 159 | edges = result['graph'].edges() 160 | 161 | print(edges) 162 | assert len(edges) == 2 163 | assert_unoriented_edge(edges, (36, 58)) 164 | 165 | def test_fifty_edges(self): 166 | result = run_fges_file("../data/50_edges.txt") 167 | edges = result['graph'].edges() 168 | 169 | dirs = [e for e in edges if e[::-1] not in edges] 170 | undirs = [e for e in edges if e[0] < e[1] and e[::-1] in edges] 171 | assert len(dirs) + len(undirs) == 50 172 | 173 | 174 | class TestCheckpoints(unittest.TestCase): 175 | 176 | def checkpoint_verify(self, data_file): 177 | result = run_fges_file(data_file, checkpoint_frequency=1, save_name='test_tmp') 178 | result2 = FGES.load_checkpoint('test_tmp-checkpoint.pkl').search() 179 | os.remove("test_tmp-checkpoint.pkl") 180 | assert set(result['graph'].edges()) == set(result2['graph'].edges()) 181 | 182 | def test_checkpoints(self): 183 | for i in range(1, 6): 184 | self.checkpoint_verify("../data/collider_{}.txt".format(i)) 185 | 186 | class RandomFGESTests(unittest.TestCase): 187 | def test_v_structure(self): 188 | ''' 189 | Graph Edges: 190 | X0 --- X1 --> X2 <-- X3 191 | ''' 192 | g = np.zeros((4, 4)) 193 | g[0, 1] = 1 194 | g[1, 2] = 1 195 | g[3, 2] = 1 196 | 197 | d = generate_data(g, [0, 1, 3, 2], 1000) 198 | 199 | result = run_fges_array(d) 200 | edges = result['graph'].edges() 201 | 202 | assert_unoriented_edge(edges, (0, 1)) 203 | assert_oriented_edge(edges, (1, 2)) 204 | assert_oriented_edge(edges, (3, 2)) 205 | assert len(edges) == 4 206 | 207 | def test_y_structure(self): 208 | ''' 209 | Graph Edges: 210 | X0 --> X1 <-- X2 211 | X1 --> X3 212 | ''' 213 | g = np.zeros((4, 4)) 214 | g[0, 1] = 1 215 | g[2, 1] = -1 216 | g[1, 3] = 2 217 | 218 | d = generate_data(g, [0, 2, 1, 3], 1000) 219 | 220 | result = run_fges_array(d) 221 | edges = result['graph'].edges() 222 | 223 | print(edges) 224 | 225 | assert_oriented_edge(edges, (0, 1)) 226 | assert_oriented_edge(edges, (2, 1)) 227 | assert_oriented_edge(edges, (1, 3)) 228 | assert len(edges) == 3 229 | 230 | def test_diamond(self): 231 | ''' 232 | Graph Edges: 233 | {X0, X1} --> X2 --> {X3, X4} --> X5 <-- X6 234 | FGES should orient all edges 235 | ''' 236 | g = np.zeros((7, 7)) 237 | g[0, 2] = 1 238 | g[1, 2] = 1 239 | g[2, 3] = 1 240 | g[2, 4] = 1 241 | g[3, 5] = 1 242 | g[4, 5] = 1 243 | g[6, 5] = 1 244 | 245 | g *= np.random.uniform(0.5, 10, g.shape) 246 | g *= np.random.choice([-1, 1], g.shape) 247 | 248 | d = generate_data(g, [0, 1, 2, 3, 4, 6, 5], 100000) 249 | 250 | result = run_fges_array(d) 251 | edges = result['graph'].edges() 252 | 253 | assert_oriented_edge(edges, (0, 2)) 254 | assert_oriented_edge(edges, (1, 2)) 255 | assert_oriented_edge(edges, (2, 3)) 256 | assert_oriented_edge(edges, (2, 4)) 257 | assert_oriented_edge(edges, (3, 5)) 258 | assert_oriented_edge(edges, (4, 5)) 259 | assert_oriented_edge(edges, (6, 5)) 260 | assert len(edges) == 7 261 | 262 | class TestKnowledge(unittest.TestCase): 263 | def test_simple_forbidden(self): 264 | """forbids all edges in case of simple_linear_test""" 265 | wisdom = Knowledge() 266 | for i in range(4): 267 | for j in range(i): 268 | wisdom.set_forbidden(i, j) 269 | wisdom.set_forbidden(j, i) 270 | result = run_fges("../data/linear_1.txt", knowledge=wisdom) 271 | assert len(result['graph'].edges) == 0 272 | 273 | def test_random_required(self): 274 | """requires an edge in a graph that would normally have no edges""" 275 | result = run_fges("../data/40_random.txt") 276 | assert len(result['graph'].edges) == 0 277 | 278 | wisdom = Knowledge() 279 | x = random.randint(0, 39) 280 | y = random.randint(0, 39) 281 | while y == x: 282 | y = random.randint(0, 39) 283 | wisdom.set_required(x, y) 284 | result = run_fges("../data/40_random.txt", knowledge=wisdom) 285 | print(x, y) 286 | print(result['graph'].edges) 287 | assert not wisdom.is_violated_by(result['graph']) 288 | 289 | def test_random_forbidden(self): 290 | """ 291 | generates graph, then forbids a random edge and regenerates, checking 292 | for absence of edge 293 | """ 294 | result = run_fges("../data/50_fully_connected.txt") 295 | edges = list(result['graph'].edges) 296 | edge = random.choice(edges) 297 | wisdom = Knowledge() 298 | wisdom.set_forbidden(edge[0], edge[1]) 299 | wisdom.set_forbidden(edge[1], edge[0]) 300 | knowledge_result = run_fges("../data/50_fully_connected.txt", knowledge=wisdom) 301 | assert not graph_util.adjacent(knowledge_result['graph'], edge[0], edge[1]) 302 | 303 | def test_tiers(self): 304 | ''' 305 | X1 --> X2 --> X3 --> X4 306 | 307 | FGES should be able to orient all edges with knowledge 308 | ''' 309 | wisdom = Knowledge() 310 | for i in range(4): 311 | wisdom.set_tier(i, i) 312 | result = run_fges("../data/linear_1.txt", knowledge=wisdom) 313 | edges = result['graph'].edges() 314 | assert_oriented_edge(edges, (0, 1)) 315 | assert_oriented_edge(edges, (1, 2)) 316 | assert_oriented_edge(edges, (2, 3)) 317 | 318 | def test_required_connections(self): 319 | 320 | wisdom = Knowledge() 321 | wisdom.set_required_connection(0, 3) 322 | 323 | result = run_fges("../data/linear_1.txt", knowledge=wisdom) 324 | edges = result['graph'].edges() 325 | print(edges) 326 | assert (0, 3) in edges or (3, 0) in edges 327 | 328 | 329 | if __name__ == "__main__": 330 | unittest.main() 331 | -------------------------------------------------------------------------------- /tests/test_graph_util.py: -------------------------------------------------------------------------------- 1 | from graph_util import * 2 | import networkx as nx 3 | import unittest 4 | 5 | class TestAncestors(unittest.TestCase): 6 | 7 | def test_simple_graph(self): 8 | ''' 9 | Test a simple graph X0 -> X1 -> X2 -> X3 10 | ''' 11 | graph = nx.DiGraph() 12 | graph.add_nodes_from([0, 1, 2, 3]) 13 | for i in [0, 1, 2]: 14 | graph.add_edge(i, i + 1) 15 | 16 | for i in range(4): 17 | assert get_ancestors(graph, i) == set(range(i + 1)) 18 | 19 | def test_cyclic_graph(self): 20 | ''' 21 | X0 -> {X1, X2} -> X3 22 | ''' 23 | graph = nx.DiGraph() 24 | graph.add_nodes_from([0, 1, 2, 3]) 25 | graph.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3)]) 26 | 27 | assert get_ancestors(graph, 0) == set([0]) 28 | assert get_ancestors(graph, 1) == set([0, 1]) 29 | assert get_ancestors(graph, 2) == set([0, 2]) 30 | assert get_ancestors(graph, 3) == set([0, 1, 2, 3]) 31 | 32 | def test_undirected_edges(self): 33 | ''' 34 | Ancestors should only consider directed edges 35 | X0 -> X1 -> X2 -- X3 --> X4 36 | ''' 37 | graph = nx.DiGraph() 38 | graph.add_nodes_from([0, 1, 2, 3, 4]) 39 | graph.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 2), (3, 4)]) 40 | 41 | assert get_ancestors(graph, 0) == set([0]) 42 | assert get_ancestors(graph, 1) == set([0, 1]) 43 | assert get_ancestors(graph, 2) == set([0, 1, 2]) 44 | assert get_ancestors(graph, 3) == set([3]) 45 | assert get_ancestors(graph, 4) == set([3, 4]) 46 | 47 | if __name__ == "__main__": 48 | unittest.main() -------------------------------------------------------------------------------- /tests/test_meek_rules.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import networkx as nx 3 | 4 | from meekrules import MeekRules 5 | from graph_util import * 6 | from knowledge import Knowledge 7 | 8 | def make_graph(num_vertices, edges): 9 | graph = nx.DiGraph() 10 | graph.add_nodes_from(list(range(num_vertices))) 11 | graph.add_edges_from(edges) 12 | return graph 13 | 14 | def group_edges(edges): 15 | undirs = [] 16 | dirs = [] 17 | for e in edges: 18 | if e[::-1] in dirs: 19 | dirs.remove(e[::-1]) 20 | undirs.append(e) 21 | else: 22 | dirs.append(e) 23 | return undirs, dirs 24 | 25 | class SingleRuleTests(unittest.TestCase): 26 | 27 | def test_rule_1(self): 28 | # 0 --> 1 --- 2 => 0 --> 1 --> 2 29 | g = make_graph(3, [(0, 1), (1, 2), (2, 1)]) 30 | meek = MeekRules(undirect_unforced_edges=False) 31 | meek.orient_implied(g) 32 | 33 | assert len(g.edges()) == 2 34 | assert has_dir_edge(g, 0, 1) 35 | assert has_dir_edge(g, 1, 2) 36 | 37 | # 0 --- 1 --> 2 => nothing 38 | g = make_graph(3, [(0, 1), (1, 0), (1, 2)]) 39 | meek = MeekRules(undirect_unforced_edges=False) 40 | meek.orient_implied(g) 41 | 42 | assert len(g.edges()) == 3 43 | assert has_undir_edge(g, 0, 1) 44 | assert has_dir_edge(g, 1, 2) 45 | 46 | # 0 --> 1 --- 2 and 0 -- 2 => nothing 47 | g = make_graph(3, [(0, 1), (1, 2), (2, 1), (0, 2), (2, 0)]) 48 | meek = MeekRules(undirect_unforced_edges=False) 49 | meek.orient_implied(g) 50 | 51 | assert len(g.edges()) == 5 52 | assert has_dir_edge(g, 0, 1) 53 | assert has_undir_edge(g, 0, 2) 54 | assert has_undir_edge(g, 1, 2) 55 | 56 | def test_rule_2(self): 57 | # 0 --> 1 --> 2 and 0 --- 2 => 0 --> 2 58 | g = make_graph(3, [(0, 1), (1, 2), (0, 2), (2, 0)]) 59 | meek = MeekRules(undirect_unforced_edges=False) 60 | meek.orient_implied(g) 61 | 62 | assert len(g.edges()) == 3 63 | assert has_dir_edge(g, 0, 1) 64 | assert has_dir_edge(g, 0, 2) 65 | assert has_dir_edge(g, 1, 2) 66 | 67 | def test_rule_3(self): 68 | ''' 69 | 0 --- 1, 0 --- 2, 0 --- 3, 1 --> 2 <-- 3 => 0 --> 2 70 | ''' 71 | g = make_graph(4, [(0, 1), (1, 0), (0, 2), (2, 0), (0, 3), (3, 0), 72 | (1, 2), (3, 2)]) 73 | 74 | assert is_kite(g, 2, 0, 1, 3) 75 | assert is_unshielded_non_collider(g, 3, 0, 1) 76 | 77 | meek = MeekRules(undirect_unforced_edges=False) 78 | meek.orient_implied(g) 79 | 80 | assert len(g.edges()) == 7 81 | assert has_undir_edge(g, 0, 1) 82 | assert has_undir_edge(g, 0, 3) 83 | assert has_dir_edge(g, 0, 2) 84 | assert has_dir_edge(g, 1, 2) 85 | assert has_dir_edge(g, 3, 2) 86 | 87 | g = make_graph(4, [(0, 1), (1, 0), (0, 2), (2, 0), (0, 3), (3, 0), 88 | (1, 2), (3, 2), (1, 3)]) 89 | 90 | assert is_kite(g, 2, 0, 1, 3) 91 | assert not is_unshielded_non_collider(g, 3, 0, 1) 92 | 93 | meek = MeekRules(undirect_unforced_edges=False) 94 | meek.orient_implied(g) 95 | 96 | assert len(g.edges()) == 9 97 | assert has_undir_edge(g, 0, 1) 98 | assert has_undir_edge(g, 0, 2) 99 | assert has_undir_edge(g, 0, 3) 100 | assert has_dir_edge(g, 1, 2) 101 | assert has_dir_edge(g, 3, 2) 102 | assert has_dir_edge(g, 1, 3) 103 | 104 | def test_rule_4(self): 105 | g = make_graph(4, [(0, 1), (1, 0), 106 | (0, 2), (2, 0), 107 | (0, 3), (3, 0), 108 | (1, 2), 109 | (2, 3)]) 110 | k = Knowledge() 111 | k.set_forbidden(1, 3) 112 | 113 | meek = MeekRules(undirect_unforced_edges=False, knowledge=k) 114 | meek.orient_implied_subset(g, [0]) 115 | 116 | assert len(g.edges()) == 7 117 | assert has_dir_edge(g, 1, 2) 118 | assert has_dir_edge(g, 2, 3) 119 | assert has_dir_edge(g, 0, 3) 120 | assert has_undir_edge(g, 0, 1) 121 | assert has_undir_edge(g, 0, 2) 122 | 123 | 124 | class LargeGraphTests(unittest.TestCase): 125 | 126 | def test_meek_graph_1a(self): 127 | g = make_graph(10, [ 128 | (0, 3), (3, 0), 129 | (3, 6), 130 | (4, 6), 131 | (1, 4), (4, 1), 132 | (1, 2), 133 | (6, 7), (7, 6), 134 | (5, 7), (7, 5), 135 | (7, 8), (8, 7), 136 | (5, 8), (8, 5), 137 | (5, 2), 138 | (2, 9), 139 | (8, 9), 140 | (5, 9), (9, 5) 141 | ]) 142 | 143 | meek = MeekRules(undirect_unforced_edges=False) 144 | meek.orient_implied(g) 145 | 146 | expected_undir_edges = [ 147 | (0, 3), 148 | (1, 4), 149 | (5, 8), 150 | ] 151 | 152 | expected_dir_edges = [ 153 | (3, 6), 154 | (4, 6), 155 | (1, 2), 156 | (6, 7), 157 | (7, 5), 158 | (7, 8), 159 | (5, 2), 160 | (2, 9), 161 | (8, 9), 162 | (5, 9), 163 | ] 164 | 165 | for e in expected_undir_edges: 166 | assert has_undir_edge(g, *e) 167 | for e in expected_dir_edges: 168 | assert has_dir_edge(g, *e) 169 | assert len(g.edges()) == len(expected_dir_edges) + 2 * len(expected_undir_edges) 170 | 171 | def test_meek_graph_1b(self): 172 | ''' 173 | Add extra oriented edges, that should be unoriented 174 | ''' 175 | g = make_graph(10, [ 176 | (3, 0), # 177 | (3, 6), 178 | (4, 6), 179 | (1, 4), # 180 | (1, 2), 181 | (6, 7), (7, 6), 182 | (5, 7), (7, 5), 183 | (7, 8), (8, 7), 184 | (5, 8), # 185 | (5, 2), 186 | (2, 9), 187 | (8, 9), 188 | (5, 9), (9, 5) 189 | ]) 190 | 191 | meek = MeekRules(undirect_unforced_edges=True) 192 | meek.orient_implied(g) 193 | 194 | expected_undir_edges = [ 195 | (0, 3), 196 | (1, 4), 197 | (5, 8), 198 | ] 199 | 200 | expected_dir_edges = [ 201 | (3, 6), 202 | (4, 6), 203 | (1, 2), 204 | (6, 7), 205 | (7, 5), 206 | (7, 8), 207 | (5, 2), 208 | (2, 9), 209 | (8, 9), 210 | (5, 9), 211 | ] 212 | 213 | for e in expected_undir_edges: 214 | assert has_undir_edge(g, *e) 215 | for e in expected_dir_edges: 216 | assert has_dir_edge(g, *e) 217 | assert len(g.edges()) == len(expected_dir_edges) + 2 * len(expected_undir_edges) 218 | 219 | def test_undirect_edges_1(self): 220 | g = make_graph(10, [ 221 | (3, 0), # 222 | (3, 6), 223 | (4, 6), 224 | (1, 4), # 225 | (1, 2), 226 | (6, 7), (7, 6), 227 | (5, 7), (7, 5), 228 | (7, 8), (8, 7), 229 | (5, 8), # 230 | (5, 2), 231 | (2, 9), 232 | (8, 9), 233 | (5, 9), (9, 5) 234 | ]) 235 | 236 | meek = MeekRules() 237 | 238 | meek.undirect_unforced_edges_func(0, g) 239 | assert has_undir_edge(g, 0, 3) 240 | assert has_dir_edge(g, 3, 6) 241 | 242 | meek.undirect_unforced_edges_func(4, g) 243 | assert has_undir_edge(g, 4, 1) 244 | assert has_dir_edge(g, 4, 6) 245 | 246 | meek.undirect_unforced_edges_func(8, g) 247 | assert has_dir_edge(g, 8, 9) 248 | assert has_undir_edge(g, 8, 7) 249 | assert has_undir_edge(g, 8, 5) 250 | 251 | if __name__ == "__main__": 252 | unittest.main() -------------------------------------------------------------------------------- /tests/test_search_util.py: -------------------------------------------------------------------------------- 1 | from search_util import * 2 | from graph_util import * 3 | import networkx as nx 4 | import unittest 5 | from SemEstimator import SemEstimator 6 | 7 | class TestDagFromPattern(unittest.TestCase): 8 | 9 | def test_triple(self): 10 | ''' 11 | X0 -- X1 -- X2 12 | Resulting graph shouldn't have X1 be a collider 13 | ''' 14 | graph = nx.DiGraph() 15 | graph.add_nodes_from([0, 1, 2]) 16 | graph.add_edges_from([(0, 1), (1, 0), (1, 2), (2, 1)]) 17 | 18 | dag = dagFromPattern(graph) 19 | 20 | assert get_undir_edge(dag) is None 21 | assert not is_def_collider(dag, 0, 1, 2) 22 | 23 | def test_cross(self): 24 | '''X0 -- X1 -- X2 and X3 -- X1 -- X4''' 25 | graph = nx.DiGraph() 26 | graph.add_nodes_from([0, 1, 2, 3, 4]) 27 | graph.add_edges_from([(0, 1), (1, 0), 28 | (1, 2), (2, 1), 29 | (3, 1), (1, 3), 30 | (1, 4), (4, 1)]) 31 | 32 | dag = dagFromPattern(graph) 33 | 34 | assert get_undir_edge(dag) is None 35 | for i in [0, 2, 3, 4]: 36 | for j in [0, 2, 3, 4]: 37 | if i != j: 38 | assert not is_def_collider(dag, i, 1, j) 39 | 40 | def test_undo(self): 41 | ''' 42 | X0 --- X1 <-- X2 43 | The algorithm will first try X0 --> X1, then have to 44 | retry since this creates a collider. 45 | ''' 46 | graph = nx.DiGraph() 47 | graph.add_nodes_from([0, 1, 2]) 48 | graph.add_edges_from([(0, 1), (1, 0), (2, 1)]) 49 | 50 | dag = dagFromPattern(graph) 51 | 52 | assert get_undir_edge(dag) is None 53 | assert not is_def_collider(dag, 0, 1, 2) 54 | assert has_dir_edge(dag, 1, 0) 55 | 56 | def test_several(self): 57 | ''' 58 | X0 --- X1 --> X2 <-- X3 --- X4 59 | ''' 60 | graph = nx.DiGraph() 61 | graph.add_nodes_from([0, 1, 2, 3, 4]) 62 | graph.add_edges_from([(0, 1), (1, 0), 63 | (1, 2), 64 | (3, 2), 65 | (3, 4), (4, 3)]) 66 | 67 | dag = dagFromPattern(graph) 68 | 69 | assert get_undir_edge(dag) is None 70 | assert not is_def_collider(dag, 0, 1, 2) 71 | assert is_def_collider(dag, 1, 2, 3) 72 | assert not is_def_collider(dag, 2, 3, 4) 73 | 74 | def test_cycle(self): 75 | ''' 76 | X0 -- X1 -- X2 -- X3 -- X0 77 | ''' 78 | graph = nx.DiGraph() 79 | graph.add_nodes_from([0, 1, 2, 3]) 80 | graph.add_edges_from([(0, 1), (1, 0), 81 | (1, 2), (2, 1), 82 | (2, 3), (3, 2), 83 | (3, 0), (0, 3)]) 84 | dag = dagFromPattern(graph) 85 | assert dag is None 86 | 87 | class TestDagFromPatternWithColliders(unittest.TestCase): 88 | 89 | def test_triple(self): 90 | ''' 91 | X0 -- X1 -- X2 92 | Resulting graph shouldn't have X1 be a collider 93 | ''' 94 | graph = nx.DiGraph() 95 | graph.add_nodes_from([0, 1, 2]) 96 | graph.add_edges_from([(0, 1), (1, 0), (1, 2), (2, 1)]) 97 | 98 | dag, penalty = dagFromPatternWithColliders(graph) 99 | 100 | assert dag is not None 101 | assert penalty == 0 102 | assert get_undir_edge(dag) is None 103 | assert not is_def_collider(dag, 0, 1, 2) 104 | 105 | def test_cross(self): 106 | '''X0 -- X1 -- X2 and X3 -- X1 -- X4''' 107 | graph = nx.DiGraph() 108 | graph.add_nodes_from([0, 1, 2, 3, 4]) 109 | graph.add_edges_from([(0, 1), (1, 0), 110 | (1, 2), (2, 1), 111 | (3, 1), (1, 3), 112 | (1, 4), (4, 1)]) 113 | 114 | dag, penalty = dagFromPatternWithColliders(graph) 115 | 116 | assert dag is not None 117 | assert penalty == 0 118 | 119 | assert get_undir_edge(dag) is None 120 | for i in [0, 2, 3, 4]: 121 | for j in [0, 2, 3, 4]: 122 | if i != j: 123 | assert not is_def_collider(dag, i, 1, j) 124 | 125 | def test_undo(self): 126 | ''' 127 | X0 --- X1 <-- X2 128 | The algorithm will first try X0 --> X1, then have to 129 | retry since this creates a collider. 130 | ''' 131 | graph = nx.DiGraph() 132 | graph.add_nodes_from([0, 1, 2]) 133 | graph.add_edges_from([(0, 1), (1, 0), (2, 1)]) 134 | 135 | dag, penalty = dagFromPatternWithColliders(graph) 136 | 137 | assert dag is not None 138 | assert penalty == 0 139 | 140 | assert get_undir_edge(dag) is None 141 | assert not is_def_collider(dag, 0, 1, 2) 142 | assert has_dir_edge(dag, 1, 0) 143 | 144 | def test_several(self): 145 | ''' 146 | X0 --- X1 --> X2 <-- X3 --- X4 147 | ''' 148 | graph = nx.DiGraph() 149 | graph.add_nodes_from([0, 1, 2, 3, 4]) 150 | graph.add_edges_from([(0, 1), (1, 0), 151 | (1, 2), 152 | (3, 2), 153 | (3, 4), (4, 3)]) 154 | 155 | dag, penalty = dagFromPatternWithColliders(graph) 156 | 157 | assert dag is not None 158 | assert penalty == 0 159 | 160 | assert get_undir_edge(dag) is None 161 | assert not is_def_collider(dag, 0, 1, 2) 162 | assert is_def_collider(dag, 1, 2, 3) 163 | assert not is_def_collider(dag, 2, 3, 4) 164 | 165 | def test_cycle(self): 166 | ''' 167 | X0 -- X1 -- X2 -- X3 -- X0 168 | ''' 169 | graph = nx.DiGraph() 170 | graph.add_nodes_from([0, 1, 2, 3]) 171 | graph.add_edges_from([(0, 1), (1, 0), 172 | (1, 2), (2, 1), 173 | (2, 3), (3, 2), 174 | (3, 0), (0, 3)]) 175 | dag, penalty = dagFromPatternWithColliders(graph) 176 | 177 | assert dag is not None 178 | assert penalty == 1 179 | assert not detect_cycle(dag) 180 | 181 | class TestEstimateParameters(unittest.TestCase): 182 | 183 | def test_params_1(self): 184 | ''' 185 | Graph Edges: 186 | 1. X1 --> X2 w = 1.0 187 | 2. X1 --> X3 w = 2.0 188 | 3. X2 --> X4 w = 0.5 189 | 4. X3 --> X4 w = -1.0 190 | ''' 191 | dataset = np.loadtxt("../data/params_1.txt", skiprows=1) 192 | 193 | estimator = SemEstimator(dataset) 194 | estimator.estimate() 195 | 196 | print(dataset.shape) 197 | 198 | true_params = np.array([[0, 1, 2, 0], 199 | [0, 0, 0, 0.5], 200 | [0, 0, 0, -1], 201 | [0, 0, 0, 0]]) 202 | 203 | true_pred = np.matmul(dataset, true_params) 204 | true_errors = true_pred - dataset 205 | true_variances = np.var(true_errors, axis=0) 206 | 207 | print("Estimated Parameters:\n", estimator.params) 208 | print("True Parameters:\n", true_params) 209 | 210 | print("Graph Error Variances:\n", estimator.residuals.diagonal()) 211 | print("True Error Variances:\n", true_variances) 212 | 213 | print("Graph Covariance:\n", estimator.graph_cov) 214 | print("True Covariance:\n", estimator.true_cov) 215 | 216 | def test_cycle(self): 217 | '''Test cycle X0 --- X1 --- X2 --- X3 --- X0''' 218 | graph = nx.DiGraph() 219 | graph.add_nodes_from([0, 1, 2, 3]) 220 | graph.add_edges_from([(0, 1), (1, 0), 221 | (1, 2), (2, 1), 222 | (2, 3), (3, 2), 223 | (3, 0), (0, 3)]) 224 | assert dagFromPattern(graph) is None 225 | 226 | graph.remove_edge(0, 1) 227 | graph.remove_edge(0, 3) 228 | new_dag = dagFromPattern(graph) 229 | assert new_dag is not None 230 | assert set(new_dag.edges()) == set([(1, 0), (1, 2), (2, 3), (3, 0)]) 231 | 232 | if __name__ == "__main__": 233 | unittest.main() -------------------------------------------------------------------------------- /tests/test_util.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | def generate_graph(num_variables, sparsity=0.1, edge_weight_range=(0.5, 1.5)): 4 | ''' 5 | Generate a random DAG (with edge weights), represented as a matrix. 6 | :param num_variables: the number of variables in the graph 7 | :param sparsity: the sparsity of the edges (i.e. the percentage of edges present compared to a complete DAG) 8 | :param edge_weight_range: range to sample uniformly to generate edge weights 9 | :return: the matrix of edge weights, and a topological ordering of the vertices 10 | ''' 11 | edge_weights = np.random.uniform(edge_weight_range[0], edge_weight_range[1], (num_variables, num_variables)) 12 | # Edge weights are uniformly distributed over +/- edge_weight_range 13 | edge_weights *= np.random.choice([1, -1], (num_variables, num_variables)) 14 | # Apply sparsity filter 15 | edge_weights *= (np.random.random((num_variables, num_variables)) < sparsity) 16 | # Make a DAG 17 | edge_weights = np.triu(edge_weights, 1) 18 | 19 | # Shuffle vertices 20 | vertex_shuffle = np.random.permutation(num_variables) 21 | edge_weights = edge_weights[vertex_shuffle, :] 22 | edge_weights = edge_weights[:, vertex_shuffle] 23 | 24 | return edge_weights, vertex_shuffle 25 | 26 | def generate_data(graph, vertex_order, num_data_points, variable_noise=1): 27 | num_vertices = graph.shape[0] 28 | 29 | data = np.zeros((num_data_points, num_vertices)) 30 | 31 | data[:, vertex_order[0]] = np.random.normal(0, variable_noise, num_data_points) 32 | 33 | for i in range(1, num_vertices): 34 | data[:, vertex_order[i]] = np.matmul(data[:, vertex_order[:i]], graph[vertex_order[:i], vertex_order[i]]) 35 | data[:, vertex_order[i]] += np.random.normal(0, variable_noise, num_data_points) 36 | return data --------------------------------------------------------------------------------