diff options
author | Matthew Sotoudeh <matthewsot@outlook.com> | 2021-06-06 10:25:51 -0700 |
---|---|---|
committer | Matthew Sotoudeh <matthewsot@outlook.com> | 2021-06-06 10:25:51 -0700 |
commit | 44e1df2ef44bb01abae66151961a9cc29425f398 (patch) | |
tree | 19d5377b9810d4a38d46afdbcde87c829fee20a0 | |
parent | 9e854eadcd4af185fd60d9297e9cc7dbcf283e04 (diff) |
Initial code release
35 files changed, 3651 insertions, 2 deletions
diff --git a/.github/workflows/test_prdnn.yml b/.github/workflows/test_prdnn.yml new file mode 100644 index 0000000..014f692 --- /dev/null +++ b/.github/workflows/test_prdnn.yml @@ -0,0 +1,30 @@ +# Adapted from: https://github.com/pubref/rules_protobuf/blob/master/.travis.yml +name: Test PRDNN + +on: [push] + +jobs: + test-prdnn: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v1 + - name: Build and test PRDNN + run: | + V=4.0.0 + OS=linux + ARCH=x86_64 + GH_BASE="https://github.com/bazelbuild/bazel/releases/download/$V" + GH_ARTIFACT="bazel-$V-installer-$OS-$ARCH.sh" + CI_BASE="http://ci.bazel.io/job/Bazel/JAVA_VERSION=1.8,PLATFORM_NAME=$OS-$ARCH/lastSuccessfulBuild/artifact/output/ci" + CI_ARTIFACT="bazel--installer.sh" + URL="$GH_BASE/$GH_ARTIFACT" + echo $URL + wget -O install.sh $URL + chmod +x install.sh + ./install.sh --user + rm -f install.sh + git clone https://github.com/95616ARG/bazel_python.git + cd bazel_python + echo y | ./setup_python.sh 3.7.4 $HOME/.bazel_python + cd .. && rm -rf bazel_python + /home/runner/bin/bazel test prdnn/... diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..231dd53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +*.sw* +experiments/results @@ -0,0 +1,46 @@ +load("@bazel_python//:bazel_python.bzl", "bazel_python_coverage_report", "bazel_python_interpreter") + +bazel_python_interpreter( + name = "bazel_python_venv", + python_version = "3.7.4", + requirements_file = "requirements.txt", + run_after_pip = """ + pip3 install -i https://pypi.gurobi.com gurobipy || exit 1 + """, + visibility = ["//:__subpackages__"], +) + +bazel_python_coverage_report( + name = "coverage_report", + code_paths = ["prdnn/*.py"], + test_paths = ["prdnn/tests/*"], +) + +# For wheel-ifying the Python code. +# Thanks! +# https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/ +genrule( + name = "wheel", + srcs = [ + "prdnn", + "requirements.txt", + "LICENSE", + "pip_info/__metadata__.py", + "pip_info/README.md", + "pip_info/setup.cfg", + "pip_info/setup.py", + ], + outs = ["prdnn.dist"], + cmd = """ + PYTHON_VENV=$(location //:bazel_python_venv) + pushd $$PYTHON_VENV/.. + source bazel_python_venv_installed/bin/activate + popd + cp pip_info/* . + python3 setup.py sdist bdist_wheel + cp -r dist $@ + """, + tools = [ + "//:bazel_python_venv", + ], +) @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matthew A. Sotoudeh and Aditya V. Thakur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. @@ -1,2 +1,120 @@ -# PRDNN: Provable Repair of Deep Neural Networks -Code will be uploaded here before PLDI 2021. +# PRDNN +PRDNN (pronounced "pardon") is a library for provable repair of Deep Neural +Networks. DNN behavior involving either finitely-many or entire polytopes of +points can be repaired using PRDNN. + +The code in this repository is the latest artifact from our paper +***Provable Repair of Deep Neural Networks***, to appear in PLDI 2021 and +currently available [on arXiv](https://arxiv.org/abs/2104.04413). +``` +@inproceedings{PLDI2021, + author = {Sotoudeh, Matthew and Thakur, Aditya V.}, + title = {Provable Repair of Deep Neural Networks}, + booktitle = {42nd {ACM} {SIGPLAN} International Conference on Programming Language Design and Implementation ({PLDI})}, + publisher = {ACM}, + year = {2021}, + note = {To appear} +} +``` + +# Quickstart +## Prerequisites +#### Using as a package +If you only wish to use PRDNN as a package in your own code, and not run any of +the experiments in `experiments`, then the instructions are: +1. Install [Gurobi](https://www.gurobi.com) (we tested 9.0.1 and 9.0.2) +2. In your project, install the `prdnn` package from PyPI: `python3 -m pip + install prdnn`. +3. _If you want to do polytope patching_, then in another session clone + [SyReNN](https://github.com/95616ARG/SyReNN) and run `make start_server`. + This step is only necessary for polytope patching, not pointwise patching. + +#### Reproducing our experiments +On the other hand, if you wish to reproduce the experiments in our paper, you +will need the following prerequisites: +1. Follow the instructions in + [bazel_python](https://github.com/95616ARG/bazel_python/) to build a + reproducible version of Python 3.7.4, which will be used by this project. It + must be built with the relevant OpenSSL libraries installed. +2. Install [Bazel](https://bazel.build) (we have tested on a variety of + versions, including 3.4.1). +3. Install [Gurobi](https://www.gurobi.com) (we tested 9.0.1 and 9.0.2) +5. If you want to patch the ImageNet model, see `ImageNet` below. +6. In another session, clone [SyReNN](https://github.com/95616ARG/SyReNN) and + run `make start_server`. +7. Run your desired tests or experiments (see below). + +The only supported way to run our experiments is through Bazel and +Bazel-Python, as described above. This ensures a reasonably reproducable +environment. + +However, PRDNN is written entirely in Python and it should be possible in many +cases to run the experiments directly. However, in this scenario you will have +to manage dependencies and downloading data on your own. + +#### Hardware Requirements +Most of the experiments can be run on consumer-grade laptop hardware with no +problems. When prompted for the number of rows to produce, note that the 4-row +experiments generally require significantly more memory. + +The paper experiments were run using 32 threads and maximum 300 GB of memory. + +## Running Tests +To run the library unit tests, use: +```bash +bazel test //prdnn/... +``` +NOTE: Bazel does not pass the `$HOME` environment variable into tests. This +means that if your Gurobi license file is stored in `$HOME/gurobi.lic` it will +not be picked up by default, causing a failed test. To resolve this, you should +explicitly set `GRB_LICENSE_FILE` before running the tests, e.g.: +```bash +GRB_LICENSE_FILE=$HOME/gurobi.lic bazel test //... +``` +To get the coverage report after running the tests, use +``` +bazel run coverage_report +``` + +## Running Experiments +To run an experiment, use: +```bash +bazel run experiments:{experiment_name} +``` +Where `{experiment_name}` is one of: +* `squeezenet_repair` +* `mnist_repair` +* `acas_repair` + +The baselines are experiments: +* `squeezenet_ft`, `squeezenet_mft` +* `mnist_ft`, `mnist_mft` +* `acas_ft`, `acas_mft` + +Results from the experiment will be printed, with detailed results placed in +`experiments/results/{experiment_name}.exp.tgz`. + +## Known Issues +There are currently known issues on macOS. We have tested it successfully on +Ubuntu 16.04, 18.04, and 20.04. + +## ImageNet +Currently, Bazel does not support archives with spaces in path names. This +prevents us from using Bazel to manage downloading/unarchiving of the +ImageNet-A and ImageNet datasets. + +The below instructions are only necessary to run +`experiments:squeezenet_*`. + +For the ImageNet-A dataset, it can be downloaded as below: +``` +URL: https://people.eecs.berkeley.edu/~hendrycks/imagenet-a.tar +SHA256: 3bb3632277e6ba6392ea64c02ddbf4dd2266c9caffd6bc09c9656d28f012589e +``` +You should extract it to some place on disk and provide the path when requested +by the ImageNet patching script. + +In order to evaluate the patched network, you will also need to download and +extract the original ImageNet validation set somewhere. AcademicTorrents +should have it. We only need the validation set itself, not the surrounding +devkit/etc. diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 0000000..784cf9f --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,42 @@ +workspace(name = "dnn_patching") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") + +git_repository( + name = "bazel_python", + commit = "f99ab8738dced7257c97dc719457f50a601ed84c", + remote = "https://github.com/95616ARG/bazel_python.git", +) + +load("@bazel_python//:bazel_python.bzl", "bazel_python") + +bazel_python() + +# See the README in: https://github.com/bazelbuild/rules_foreign_cc +all_content = """filegroup(name = "all", srcs = glob(["**"]), visibility = ["//visibility:public"])""" + +# MODELS https://github.com/eth-sri/eran +http_file( + name = "mnist_relu_3_100_model", + downloaded_file_path = "model.eran", + sha256 = "e4151dfced1783360ab8353c8fdedbfd76f712c2c56e4b14799b2f989217229f", + urls = ["https://files.sri.inf.ethz.ch/eran/nets/tensorflow/mnist/mnist_relu_3_100.tf"], +) + +http_archive( + name = "onnx_squeezenet", + build_file_content = all_content, + sha256 = "aff6280d73c0b826f088f7289e4495f01f6e84ce75507279e1b2a01590427723", + strip_prefix = "squeezenet1.1", + urls = ["https://s3.amazonaws.com/onnx-model-zoo/squeezenet/squeezenet1.1/squeezenet1.1.tar.gz"], +) + +# DATASETS +http_archive( + name = "mnist_c", + build_file_content = all_content, + sha256 = "af9ee8c6a815870c7fdde5af84c7bf8db0bcfa1f41056db83871037fba70e493", + strip_prefix = "mnist_c", + urls = ["https://zenodo.org/record/3239543/files/mnist_c.zip"], +) diff --git a/experiments/BUILD b/experiments/BUILD new file mode 100644 index 0000000..ef89d3c --- /dev/null +++ b/experiments/BUILD @@ -0,0 +1,109 @@ +py_library( + name = "experiment", + srcs = ["experiment.py"], +) + +py_binary( + name = "mnist_repair", + srcs = ["mnist_repair.py"], + data = [ + "@mnist_c//:all", + "@mnist_relu_3_100_model//file", + ], + deps = [ + ":experiment", + "//prdnn", + ], +) + +py_binary( + name = "mnist_ft", + srcs = ["mnist_ft.py"], + data = [ + "@mnist_c//:all", + "@mnist_relu_3_100_model//file", + ], + deps = [ + ":mnist_repair", + "//prdnn", + ], +) + +py_binary( + name = "mnist_mft", + srcs = ["mnist_mft.py"], + data = [ + "@mnist_c//:all", + "@mnist_relu_3_100_model//file", + ], + deps = [ + ":mnist_repair", + "//prdnn", + ], +) + +py_binary( + name = "acas_repair", + srcs = ["acas_repair.py"], + data = glob(["models/acas_2_9.eran"]), + deps = [ + ":experiment", + "//prdnn", + ], +) + +py_binary( + name = "acas_ft", + srcs = ["acas_ft.py"], + data = glob(["models/acas_2_9.eran"]), + deps = [ + ":acas_repair", + "//prdnn", + ], +) + +py_binary( + name = "acas_mft", + srcs = ["acas_mft.py"], + data = glob(["models/acas_2_9.eran"]), + deps = [ + ":acas_repair", + "//prdnn", + ], +) + +py_binary( + name = "squeezenet_repair", + srcs = ["squeezenet_repair.py"], + data = ["@onnx_squeezenet//:all"], + deps = [ + ":experiment", + ":imagenet_helpers", + "//prdnn", + ], +) + +py_binary( + name = "squeezenet_ft", + srcs = ["squeezenet_ft.py"], + data = ["@onnx_squeezenet//:all"], + deps = [ + ":squeezenet_repair", + "//prdnn", + ], +) + +py_binary( + name = "squeezenet_mft", + srcs = ["squeezenet_mft.py"], + data = ["@onnx_squeezenet//:all"], + deps = [ + ":squeezenet_repair", + "//prdnn", + ], +) + +py_binary( + name = "imagenet_helpers", + srcs = ["imagenet_helpers.py"], +) diff --git a/experiments/README.md b/experiments/README.md new file mode 100644 index 0000000..0e7a035 --- /dev/null +++ b/experiments/README.md @@ -0,0 +1,9 @@ +# Experiments +These are Python scripts to reproduce experiments from our paper. Experiments +can be run by calling `bazel run experiments:{experiment_name}`. Results are +placed in a ``results`` folder in this directory. + +Note that in order to run `experiments:squeezenet_*`, you must have both the +ImageNet-A and ImageNet-Validation datasets extracted on the local machine and +provide their paths when requested. See [../README](../README) for more +information. diff --git a/experiments/acas_ft.py b/experiments/acas_ft.py new file mode 100644 index 0000000..bab975b --- /dev/null +++ b/experiments/acas_ft.py @@ -0,0 +1,71 @@ +"""Methods for fine-tuning the ACAS Xu network.""" +from timeit import default_timer as timer +import numpy as np +from prdnn import DDNN, FTRepair +from experiments.acas_repair import ACASRepair + +class ACASFT(ACASRepair): + """Experiment testing fine-tuning repair on an ACAS Xu model.""" + def do_repair(self, train_regions, train_syrenn, syrenn_time): + n_unique = len(set({tuple(point) + for upolytope in train_syrenn + for pre_poly in upolytope + for point in pre_poly})) + samples_per_plane = [n_unique // len(train_regions) for _ in range(len(train_regions))] + + patcher = FTRepair.from_spec_function( + self.network, train_regions, self.property, + samples_per_plane=samples_per_plane) + patcher.epochs = 1000 + patcher.lr = 0.001 + patcher.momentum = 0.9 + patcher.batch_size = 16 + patched = patcher.compute() + assert patched is not None + self.record_artifact(patched, f"patched", "network") + self.record_artifact(patcher.inputs, "train_inputs", "pickle") + self.record_artifact(patcher.labels, "train_labels", "pickle") + timing = patcher.timing.copy() + timing["syrenn"] = syrenn_time + self.record_artifact(timing, f"timing", "pickle") + + def analyze(self): + """Analyze the results.""" + unpatched = self.read_artifact("unpatched") + self.network = unpatched + patched = self.read_artifact("patched") + timing = self.read_artifact("timing") + train_syrenn = self.read_artifact("train_syrenn") + test_syrenn = self.read_artifact("test_syrenn") + train_inputs = self.read_artifact("train_inputs") + train_labels = self.read_artifact("train_labels") + + total_points = sum(len(pre_poly) for upolytope in train_syrenn + for pre_poly in upolytope) + print("Size of repair set:", total_points) + + og_train_outputs = np.argmax(unpatched.compute(train_inputs), axis=1) + print("Number of repair set points originally buggy:", + np.sum(og_train_outputs != train_labels)) + + gen_set, drawdown_set = self.find_counterexamples(unpatched, test_syrenn) + print("Size of generalization, drawdown sets:", len(gen_set), len(drawdown_set)) + + print("Time (seconds):", timing["total"]) + + train_outputs = np.argmax(patched.compute(train_inputs), axis=1) + print("Number of repair set points buggy after repair:", + np.sum(train_outputs != train_labels)) + + dd_desired = self.property(drawdown_set) + dd_outputs = np.argmax(patched.compute(drawdown_set), axis=1) + print("Drawdown-set counterexamples after repair:", np.sum(dd_desired != dd_outputs)) + + gen_desired = self.property(gen_set) + gen_outputs = np.argmax(patched.compute(gen_set), axis=1) + print("Generalization-set counterexamples after repair:", np.sum(gen_desired != gen_outputs)) + + return True + +if __name__ == "__main__": + ACASFT("acas_ft").main() diff --git a/experiments/acas_mft.py b/experiments/acas_mft.py new file mode 100644 index 0000000..b16a070 --- /dev/null +++ b/experiments/acas_mft.py @@ -0,0 +1,86 @@ +"""Methods for patching the ACAS Xu network with SyReNN.""" +from timeit import default_timer as timer +import numpy as np +from pysyrenn import FullyConnectedLayer +from prdnn import DDNN, FTRepair +from experiments.acas_repair import ACASRepair + +class ACASMFT(ACASRepair): + """Experiment testing patching performance on an ACAS Xu model.""" + def do_repair(self, train_regions, train_syrenn, syrenn_time): + n_unique = len(set({tuple(point) + for upolytope in train_syrenn + for pre_poly in upolytope + for point in pre_poly})) + samples_per_plane = [n_unique // len(train_regions) for _ in range(len(train_regions))] + + _patcher = FTRepair.from_spec_function( + self.network, train_regions, self.property, + samples_per_plane=samples_per_plane) + self.record_artifact(_patcher.inputs, "train_inputs", "pickle") + self.record_artifact(_patcher.labels, "train_labels", "pickle") + + patchable = [i for i, layer in enumerate(self.network.layers) + if isinstance(layer, FullyConnectedLayer)] + for layer in patchable: + patcher = FTRepair(self.network, _patcher.inputs.copy(), _patcher.labels.copy()) + patcher.layer = layer + patcher.norm_objective = True + patcher.auto_stop = False + patcher.make_holdout_set() + patcher.epochs = 1000 + patcher.lr = 0.001 + patcher.momentum = 0.9 + patcher.batch_size = 16 + patched = patcher.compute() + assert patched is not None + self.record_artifact(patched, f"{layer}_patched", "network") + timing = patcher.timing.copy() + timing["syrenn"] = syrenn_time + self.record_artifact(timing, f"{layer}_timing", "pickle") + + def analyze(self): + unpatched = self.read_artifact("unpatched") + self.network = unpatched + + train_syrenn = self.read_artifact("train_syrenn") + test_syrenn = self.read_artifact("test_syrenn") + train_inputs = self.read_artifact("train_inputs") + train_labels = self.read_artifact("train_labels") + + patchable = [i for i, layer in enumerate(self.network.layers) + if isinstance(layer, FullyConnectedLayer)] + for layer in patchable: + print("~~~~~ Layer:", layer, "~~~~~") + patched = self.read_artifact(f"{layer}_patched") + timing = self.read_artifact(f"{layer}_timing") + + total_points = sum(len(pre_poly) for upolytope in train_syrenn + for pre_poly in upolytope) + print("Size of repair set:", total_points) + + og_train_outputs = np.argmax(unpatched.compute(train_inputs), axis=1) + print("Number of repair set points originally buggy:", + np.sum(og_train_outputs != train_labels)) + + gen_set, drawdown_set = self.find_counterexamples(unpatched, test_syrenn) + print("Size of generalization, drawdown sets:", len(gen_set), len(drawdown_set)) + + print("Time (seconds):", timing["total"]) + + train_outputs = np.argmax(patched.compute(train_inputs), axis=1) + print("Number of repair set points buggy after repair:", + np.sum(train_outputs != train_labels)) + + dd_desired = self.property(drawdown_set) + dd_outputs = np.argmax(patched.compute(drawdown_set), axis=1) + print("Drawdown-set counterexamples after repair:", np.sum(dd_desired != dd_outputs)) + + gen_desired = self.property(gen_set) + gen_outputs = np.argmax(patched.compute(gen_set), axis=1) + print("Generalization-set counterexamples after repair:", np.sum(gen_desired != gen_outputs)) + + return True + +if __name__ == "__main__": + ACASMFT("acas_mft").main() diff --git a/experiments/acas_repair.py b/experiments/acas_repair.py new file mode 100644 index 0000000..dcf3ca8 --- /dev/null +++ b/experiments/acas_repair.py @@ -0,0 +1,222 @@ +"""Experiment for repairing the ACAS Xu network with SyReNN.""" +from timeit import default_timer as timer +import numpy as np +from prdnn import DDNN, ProvableRepair +from experiments.experiment import Experiment + +class ACASRepair(Experiment): + """Experiment testing Provable Repair on an ACAS Xu model.""" + def run(self): + """Repair the ACAS Xu network and record results.""" + np.random.seed(24) + self.network = self.load_network("acas_2_9") + input_helpers = self.load_input_data("acas") + process = input_helpers["process"] + + regions = self.find_regions( + # These are sampled: + (-0.1, 0.1), (600, 1200), (600, 1200), + # These are SyReNN'd: + (0, 60760), (-np.pi, -0.75 * np.pi), + process, n_samples=20) + + network = self.network + train_regions = regions[:10] + test_regions = regions[10:] + assert len(test_regions) == 12 + + self.record_artifact(network, "unpatched", "network") + + # Now that we have the regions, compute the SyReNN. + syrenn_start = timer() + train_syrenn = network.transform_planes( + train_regions, compute_preimages=True, include_post=False) + syrenn_time = timer() - syrenn_start + # We don't time this because it's just for evaluation. + test_syrenn = network.transform_planes( + test_regions, compute_preimages=True, include_post=False) + + self.record_artifact(train_syrenn, "train_syrenn", "pickle") + self.record_artifact(test_syrenn, "test_syrenn", "pickle") + + self.do_repair(train_regions, train_syrenn, syrenn_time) + + def do_repair(self, train_regions, train_syrenn, syrenn_time): + # Then we start the repair. + patcher = ProvableRepair.from_spec_function( + self.network, 12, train_regions, self.property, + use_representatives=True) + patcher.constraint_type = "linf" + patcher.soft_constraint_slack_lb = -2.0 + patcher.soft_constraint_slack_ub = 0. + patcher.soft_constraint_weight = 100. + patcher.constraint_buffer = 0. + patcher.gurobi_crossover = 0 + # Batching any more than this doesn't really seem to help. + patcher.batch_size = 2048 + patched = patcher.compute() + assert patched is not None + self.record_artifact(patched, f"patched", "ddnn") + timing = patcher.timing.copy() + timing["syrenn"] = syrenn_time + timing["total"] += syrenn_time + self.record_artifact(timing, f"timing", "pickle") + + def analyze(self): + """Analyze the results.""" + unpatched = self.read_artifact("unpatched") + self.network = unpatched + patched = self.read_artifact("patched") + timing = self.read_artifact("timing") + train_syrenn = self.read_artifact("train_syrenn") + test_syrenn = self.read_artifact("test_syrenn") + + total_points = sum(len(pre_poly) for upolytope in train_syrenn + for pre_poly in upolytope) + print("Size of repair set:", total_points) + + gen_set, drawdown_set = self.find_counterexamples(unpatched, test_syrenn) + print("Size of generalization, drawdown sets:", len(gen_set), len(drawdown_set)) + + print("Time (seconds):", timing) + + print("Polytope accuracy in the repair set after repair (should be 1.0 = 100%):", + self.spec_accuracy(patched, train_syrenn)[2]) + + dd_desired = self.property(drawdown_set) + dd_outputs = np.argmax(patched.compute(drawdown_set), axis=1) + print("Drawdown-set counterexamples after repair:", np.sum(dd_desired != dd_outputs)) + + gen_desired = self.property(gen_set) + gen_outputs = np.argmax(patched.compute(gen_set), axis=1) + print("Generalization-set counterexamples after repair:", np.sum(gen_desired != gen_outputs)) + + return True + + def find_regions(self, *args, **kwargs): + """Returns 20 input slices which have counterexamples. + + Overall, this is accomplished by randomly sampling regions, applying + SyReNN, and seeing if they have a counterexample. + + To speed this process up, I have manually run it for enough iterations + to see which of the first batch of randomly-sampled regions have + counterexamples. Then I specified their indices in @with_cexs, which + allows us to skip computing SyReNN for regions without counterexamples + (there are lots of them!). To verify this, you may set with_cexs=[] to + force the system to check for counterexamples on all randomly-sampled + regions explicitly. + """ + np.random.seed(24) + n_samples = kwargs["n_samples"] + with_cexs = [[3, 5, 7, 38, 55], + [5, 16, 23, 48, 70, 99], + [1, 10, 16, 38, 59, 74, 99], + [64, 71, 89, 92]] + found = [] + iters = -1 + while len(found) < n_samples: + iters += 1 + kwargs["n_samples"] = 100 + regions = self.compute_regions(*args, **kwargs) + if iters < len(with_cexs): + regions = [regions[i] for i in with_cexs[iters]] + syrenn = self.network.transform_planes( + regions, compute_preimages=True, include_post=False) + for i, upolytope in enumerate(syrenn): + all_points = np.concatenate(upolytope) + outputs = np.argmax(self.network.compute(all_points), axis=1) + if np.any(outputs >= 2): + found.append(regions[i]) + return found + + def find_counterexamples(self, network, syrenn): + """Given SyReNN for a region, returns cexs and non-cexs.""" + np.random.seed(24) + counterexamples = [] + drawdown_pts = [] + for upolytope in syrenn: + all_polys = np.concatenate(upolytope) + min_ = np.min(all_polys, axis=0) + max_ = np.max(all_polys, axis=0) + + all_polys = [] + for pre_poly in upolytope: + center = np.mean(pre_poly, axis=0) + for alpha in [0.25, 0.5, 0.75]: + poly = pre_poly + (alpha * (pre_poly - center)) + all_polys.extend(poly) + desired = self.property(all_polys) + outputs = np.argmax(network.compute(all_polys), axis=1) + cex_points = np.asarray(all_polys)[outputs != desired] + counterexamples.extend(cex_points) + + sample_points = np.random.uniform(min_, max_, size=(5*len(cex_points), 5)) + desired = self.property(sample_points) + outputs = np.argmax(network.compute(sample_points), axis=1) + sample_points = sample_points[desired == outputs][:len(cex_points)] + drawdown_pts.extend(sample_points) + return counterexamples, drawdown_pts + + def spec_accuracy(self, network, syrenn): + """Computes statistics about how well the given network meets the spec. + + Note that these are based on SyReNN, by checking the vertices of the + linear regions. If it states that there are no bad points, then the + entire region is guaranteed to meet the spec. + """ + n_good, n_bad, area_bad = 0, 0, 0. + polytopes = (pre_poly for upolytope in syrenn for pre_poly in upolytope) + for pre_poly in polytopes: + desired = self.property(pre_poly) + if isinstance(network, DDNN): + representative = np.mean(pre_poly, axis=0) + representatives = np.array([representative for _ in pre_poly]) + patched_output = network.compute( + pre_poly, representatives=representatives) + else: + patched_output = network.compute(pre_poly) + patched_output = np.argmax(patched_output, axis=1) + is_correct = np.all(patched_output == desired) + if is_correct: + n_good += 1 + else: + n_bad += 1 + return (n_good, n_bad, n_good / (n_good + n_bad), area_bad) + + def property(self, inputs): + """Property 8 from the Reluplex paper (Katz et al.). + + Note this is a slightly strengthened version of that property, in order + to make it convex/conjunctive. + """ + output = self.network.compute(inputs) + # labels is 0 when it should be COC, 1 when it should be WL. + label_wl = (output[:, 1] > output[:, 0]).astype(int) + return label_wl.astype(int) + + def compute_regions(self, + intruder_heading, own_velocity, intruder_velocity, + rho, phi, process, n_samples): + """Samples @n_samples 2D slices from the space.""" + regions = [] + for _ in range(n_samples): + self.intruder_heading = np.random.uniform(*intruder_heading) + self.own_velocity = np.random.uniform(*own_velocity) + self.intruder_velocity = np.random.uniform(*intruder_velocity) + regions.append(process(np.array([ + self.build_input(rho[0], phi[0]), + self.build_input(rho[1], phi[0]), + self.build_input(rho[1], phi[1]), + self.build_input(rho[0], phi[1]), + ]))) + return regions + + def build_input(self, distance, psi): + """Returns an (un-processed) input point corresponding to the scenario. + """ + return np.array([distance, psi, self.intruder_heading, + self.own_velocity, self.intruder_velocity]) + +if __name__ == "__main__": + ACASRepair("acas_repair").main() diff --git a/experiments/experiment.py b/experiments/experiment.py new file mode 100644 index 0000000..2719075 --- /dev/null +++ b/experiments/experiment.py @@ -0,0 +1,357 @@ +"""Base class for executing, recording data for, and analyzing experiments. +""" +import base64 +import csv +import io +import os +import pickle +import shutil +import tarfile +import numpy as np +from PIL import Image +import imageio +from pysyrenn import Network +from prdnn import DDNN +from syrenn_proto import syrenn_pb2 as syrenn_pb + +class Experiment: + """Abstract class describing a network experiment. + """ + def __init__(self, directory_name): + """Initializes a new experiment. + + Creates an output directory, removing any existing files in that + location. Also initializes a new artifacts_csv file which holds a list + of all the artifacts written to using the "record_artifact" interface. + """ + # Create a directory outside of bazel-bin for storing the results. + global_dir = os.environ["BUILD_WORKING_DIRECTORY"] + self.directory = "{}/experiments/results/{}".format( + global_dir, directory_name) + shutil.rmtree(self.directory, ignore_errors=True) + os.makedirs(self.directory, exist_ok=True) + + self.tar_name = "%s.exp.tgz" % self.directory + self.open_files = [] + self.artifacts = None + self.artifacts_csv = self.begin_csv("artifacts", ["key", "type", "path"]) + + def close(self, tar=True, nicely=True): + """Ends the experiment, freeing open file pointers. + + @tar determines whether the experiment directory should be tarred into + an archive. In general, this is done after the initial experiments and + then once more if the analysis produces any new files. + + @nicely should indicate whether the closing is expected or not. For + example, if the program errors in the middle of an experiment, it is + not "nice." nicely=False will leave the experiment directory alone + (i.e. untarred and unremoved). + """ + for open_file in self.open_files: + open_file.close() + self.open_files = [] + + if tar and nicely: + # tar directory into directory.exp.tar + with tarfile.open(self.tar_name, "w:gz") as archive: + for name in os.listdir(self.directory): + archive.add("%s/%s" % (self.directory, name), arcname=name) + if nicely: + shutil.rmtree(self.directory, ignore_errors=True) + + def open(self): + """Reads experiment data from a previous run. + + In general, this is called after run() and close(), or when doing an + analyze-only execution of previous experimental results. + """ + # Create the extraction directory. + shutil.rmtree(self.directory, ignore_errors=True) + os.mkdir(self.directory) + + # Extract the tar file. + with tarfile.open(self.tar_name, "r:*") as archive: + archive.extractall(self.directory) + + self.artifacts = self.read_csv("artifacts") + # Re-open and re-fill the CSV file so we can keep writing to it. + self.artifacts_csv = self.begin_csv("artifacts", ["key", "type", "path"]) + # TODO(masotoud): look into a way to open the file for appending. + # instead of truncating + re-adding. + for artifact in self.artifacts: + self.write_csv(self.artifacts_csv, artifact) + + def has_archive(self): + """True if the experiment seems to have already been run. + """ + return os.path.exists(self.tar_name) + + def remove_archive(self): + """Removes an existing archive. + """ + return os.remove(self.tar_name) + + def __del__(self): + """Close file handles in case of unexpected exit. + + Normal exits should call .close(nicely=True). + """ + self.close(nicely=False) + + @staticmethod + def load_network(network_name, maxify_acas=True): + """Loads an experiment network given by @network_name. + + Currently supports models of the form: + - acas_#_# (ACAS Xu models translated from the ReluPlex format) + - {cifar10,mnist}_relu_#_# (fully-connected ReLU models from ERAN) + - {cifar10,mnist}_relu_conv{small,medium,big}{_diffai,_pgd} + (convolutional ReLU models from ERAN). + + And should be referenced in BUILD rule experiments:models. + + maxify_acas controlls whether the ACAS model is "cleaned" before + returned; cleaning removes the unnecessary ReLU layer at the end as + well as inverts the outputs so the recommended action becomes the + maximal score. + """ + if "acas_" in network_name: + _, i, j = network_name.split("_") + network = Network.from_file("experiments/models/acas_%s_%s.eran" + % (i, j)) + if maxify_acas: + # We remove ReLU layers from the end of the model as they don't + # actually change the classification (when one exists). + assert not hasattr(network.layers[:-1], "weights") + network.layers = network.layers[:-1] + + # ACAS Xu networks use the minimal score as the class instead + # of the more-standard maximum score; this inverts the last + # layer so the minimal score becomes the max. + network.layers[-1].weights *= -1.0 + network.layers[-1].biases *= -1.0 + return network + if "squeezenet" in network_name: + return Network.from_file("external/onnx_squeezenet/squeezenet1.1.onnx") + return Network.from_file( + "external/%s_model/file/model.eran" % (network_name)) + + @staticmethod + def load_input_data(name_or_path, is_eran_conv_model=False): + """Gets a dataset and/or its metadata. + + Currently supports three datasets: + - acas (empty dataset which returns preprocessing info for ACAS) + - cifar10_test (100 test images from ERAN) + - mnist_test (100 test images from ERAN) + + Returns a dictionary with four items: + - process(np_array) will process a raw (uint8) Numpy array image into a + format that can be passed to the Network. + - reset(np_array) will invert process(...). This may not always be + possible if process(...) is non-invertible, but it should at least + work on all valid images (i.e., uint8 pixel values). + - raw_inputs holds (flattened) uint8 Numpy arrays for each input image. + - labels holds the corresponding label for each input image. + """ + if name_or_path == "acas": + mins = np.array([0.0, -3.141593, -3.141593, 100.0, 0.0]) + maxes = np.array([60760.0, 3.141593, 3.141593, 1200.0, 1200.0]) + means = np.array([1.9791091e+04, 0.0, 0.0, 650.0, 600.0]) + std_deviations = np.array([60261.0, 6.28318530718, 6.28318530718, + 1100.0, 1200.0]) + return { + "name": name_or_path, + "process": lambda i: ((np.clip(i, mins, maxes) - means) / std_deviations), + "reset": lambda i: ((i * std_deviations) + means), + "raw_inputs": [], + "labels": [], + } + inputs_file_path = "external/%s_data/file/data.csv" % name_or_path + # ERAN models + with open(inputs_file_path, "r", newline="") as inputs_file: + csv_inputs = csv.reader(inputs_file) + input_data = np.array(list(csv_inputs)).astype(np.float64) + + # TODO(masotoud): handle this more robustly. + process_input = lambda i: i / 255.0 + reset_input = lambda i: np.round(i * 255.0) + return { + "name": name_or_path, + "process": process_input, + "reset": reset_input, + "raw_inputs": input_data[:, 1:], + "labels": input_data[:, 0].astype(np.int), + } + + def begin_csv(self, filename, column_labels, extrasaction="raise"): + """Opens a new CSV file with the given column labels for writing. + + Returns a tuple (file_handle, csv_writer) that can be passed to + write_csv. These do not need to be manually flushed or closed --- that + is handled by Experiment.close() and Experiment.write_csv(). + + @filename should be a path-safe identifier for the CSV file (extension + and path not necessary). + @column_labels should be a list of (string) column labels. These will + correspond to dictionary keys in write_csv and read_csv. + """ + dirname = os.path.dirname(filename) + self.artifact_directory(dirname) # Ensure the directory exists + csv_file = open("%s/%s.csv" % (self.directory, filename), "w", + newline="") + csv_writer = csv.DictWriter(csv_file, column_labels, + extrasaction=extrasaction) + csv_writer.writeheader() + self.open_files.append(csv_file) + return (csv_file, csv_writer) + + @staticmethod + def write_csv(csv_data, record): + """Writes a record to a CSV file opened with Experiment.begin_csv(...). + + @csv_data should be the tuple returned by Experiment.begin_csv(...) + @record should be a dictionary with keys corresponding to the + @column_labels passed to Experiment.begin_csv(...) + """ + csv_data[1].writerow(record) + csv_data[0].flush() + + def read_csv(self, filename): + """Fully reads a CSV file and returns a list of the rows. + + Each row is represented by a dictionary with keys corresponding to the + columns. Dictionary values are strings --- parsing them to a usable + format is left to the caller. + """ + filename = "%s/%s.csv" % (self.directory, filename) + with open(filename, "r", newline="") as csv_file: + csv_reader = csv.DictReader(csv_file) + data = [] + for record in csv_reader: + data.append(dict(record)) + return data + + def artifact_directory(self, dir_key): + """Creates a directory that will be included in the experiment archive. + + Returns its path without trailing /. + """ + name = "%s/%s" % (self.directory, dir_key) + os.makedirs(name, exist_ok=True) + return name + + def record_artifact(self, artifact, key, artifact_type): + """Record a high-level artifact from the experiment. + + Each Experiment instance has a corresponding "artifact store" which + allows one to easily record, store, and later reference artifacts + produced during the experiment. This method adds an artifact @artifact + to that store, using key @key under the assumption that the artifact + should be treated as type @artifact_type. + """ + filename = "%s/%s" % (self.directory, key) + + file_directory = os.path.dirname(filename) + if artifact_type != "rawpath" and not os.path.exists(file_directory): + # See notes on a possible race condition in the answer here: + # https://stackoverflow.com/questions/10149263 + os.makedirs(file_directory) + + def write_pb(path, pb_serialized): + """Writes @pb_serialized to @path. + """ + with open(path, "wb") as to_file: + to_file.write(pb_serialized.SerializeToString()) + + if artifact_type == "np_array": + filename += ".npy" + np.save(filename, artifact) + elif artifact_type == "pickle": + filename += ".pickle" + with open(filename, "wb") as to_file: + pickle.dump(artifact, to_file) + elif artifact_type in ("network", "ddnn"): + filename += ".pb" + write_pb(filename, artifact.serialize()) + elif artifact_type == "csv": + filename = artifact + else: + raise NotImplementedError + record = {"key": key, "type": artifact_type, "path": filename} + self.write_csv(self.artifacts_csv, record) + if self.artifacts is not None: + self.artifacts.append(record) + + def read_artifact(self, key): + """Reads an artifact from the loaded artifact store indexed by @key. + + Experiment.open() *MUST* be called before using read_artifact(...). + This method is intended to be used only by the analyze() method (not + run, which should be calling record_artifact). + """ + assert self.artifacts is not None + try: + artifact = next(artifact for artifact in self.artifacts + if artifact["key"] == key) + except StopIteration: + raise KeyError + + def read_pb(path, pb_type): + """Deserializes protobuf data stored to a file. + + @path is the file path, @pb_type is the Protobuf descriptor to + parse as. + """ + with open(path, "rb") as from_file: + string_rep = from_file.read() + serialized = pb_type() + serialized.ParseFromString(string_rep) + return serialized + + if artifact["type"] == "np_array": + return np.load(artifact["path"], allow_pickle=True) + if artifact["type"] == "pickle": + with open(artifact["path"], "rb") as from_file: + return pickle.load(from_file) + if artifact["type"] == "csv": + return self.read_csv(artifact["path"]) + if artifact["type"] == "network": + return Network.deserialize( + read_pb(artifact["path"], syrenn_pb.Network)) + if artifact["type"] == "ddnn": + return DDNN.deserialize( + read_pb(artifact["path"], syrenn_pb.MaskingNetwork)) + raise NotImplementedError + + def run(self): + """Runs the analysis on the network and inputs. + """ + raise NotImplementedError + + def analyze(self): + """Performs analysis and summarization after a run(). + + Experiment.read_artifact(key) should be used to recover data from the + experiment. + """ + raise NotImplementedError + + def main(self): + """Main experiment harness. + """ + run = not self.has_archive() + if not run: + print("It seems that this experiment has already been run.") + choice = input("[R]e-run, [A]nalyze-only, or [D]elete and re-run? ").lower()[0] + assert choice in {"r", "a", "d"} + if choice == "d": + self.remove_archive() + run = choice in {"r", "d"} + if run: + self.run() + self.close() + self.open() + did_modify = self.analyze() + self.close(tar=did_modify) diff --git a/experiments/imagenet_helpers.py b/experiments/imagenet_helpers.py new file mode 100644 index 0000000..b64976a --- /dev/null +++ b/experiments/imagenet_helpers.py @@ -0,0 +1,180 @@ +"""Helper methods for reading ImageNet-like datasets.""" +import os +import pathlib +import random +from PIL import Image +import numpy as np + +def read_imagenet_images(parent, n_labels=None, use_labels=None): + """Reads a particular subset of the ImageNet dataset stored in @parent. + + The idea is that @parent has a number of subdirectories, each corresponding + to a class, and under which there are a number of images. @n_labels gives + the total number of labels you want. @use_labels limits it to a particular + subset of the labels. + + Returns a pair (images, labels) + + Used by imagenet_patching.py + """ + subdirs = [subdir for subdir in sorted(os.listdir(parent)) + if subdir != "README.txt"] + if use_labels is not None: + use_labels = list(map(SYNSETS.__getitem__, use_labels)) + subdirs = [subdir for subdir in subdirs + if int(subdir[1:]) in use_labels] + if n_labels is not None: + subdirs = subdirs[:n_labels] + + all_images, all_labels = [], [] + for subdir in subdirs: + if subdir == "README.txt": + continue + synset_id = int(subdir[1:]) + label = SYNSETS.index(synset_id) + images = sorted(os.listdir(f"{parent}/{subdir}")) + random.shuffle(images) + n_read = 0 + for image in images: + path = pathlib.Path(f"{parent}/{subdir}/{image}") + image = np.asarray( + Image.open(path.resolve()) + .resize((224, 224))) / 255. + if len(image.shape) == 3: + all_images.append(image) + all_labels.append(label) + n_read += 1 + else: + # Bad shape; we can de-BW it if we want. + pass + return np.array(all_images), np.array(all_labels) + +# https://gist.github.com/fnielsen/4a5c94eaa6dcdf29b7a62d886f540372 +SYNSETS = list([ + 1440764, 1443537, 1484850, 1491361, 1494475, 1496331, 1498041, 1514668, + 1514859, 1518878, 1530575, 1531178, 1532829, 1534433, 1537544, 1558993, + 1560419, 1580077, 1582220, 1592084, 1601694, 1608432, 1614925, 1616318, + 1622779, 1629819, 1630670, 1631663, 1632458, 1632777, 1641577, 1644373, + 1644900, 1664065, 1665541, 1667114, 1667778, 1669191, 1675722, 1677366, + 1682714, 1685808, 1687978, 1688243, 1689811, 1692333, 1693334, 1694178, + 1695060, 1697457, 1698640, 1704323, 1728572, 1728920, 1729322, 1729977, + 1734418, 1735189, 1737021, 1739381, 1740131, 1742172, 1744401, 1748264, + 1749939, 1751748, 1753488, 1755581, 1756291, 1768244, 1770081, 1770393, + 1773157, 1773549, 1773797, 1774384, 1774750, 1775062, 1776313, 1784675, + 1795545, 1796340, 1797886, 1798484, 1806143, 1806567, 1807496, 1817953, + 1818515, 1819313, 1820546, 1824575, 1828970, 1829413, 1833805, 1843065, + 1843383, 1847000, 1855032, 1855672, 1860187, 1871265, 1872401, 1873310, + 1877812, 1882714, 1883070, 1910747, 1914609, 1917289, 1924916, 1930112, + 1943899, 1944390, 1945685, 1950731, 1955084, 1968897, 1978287, 1978455, + 1980166, 1981276, 1983481, 1984695, 1985128, 1986214, 1990800, 2002556, + 2002724, 2006656, 2007558, 2009229, 2009912, 2011460, 2012849, 2013706, + 2017213, 2018207, 2018795, 2025239, 2027492, 2028035, 2033041, 2037110, + 2051845, 2056570, 2058221, 2066245, 2071294, 2074367, 2077923, 2085620, + 2085782, 2085936, 2086079, 2086240, 2086646, 2086910, 2087046, 2087394, + 2088094, 2088238, 2088364, 2088466, 2088632, 2089078, 2089867, 2089973, + 2090379, 2090622, 2090721, 2091032, 2091134, 2091244, 2091467, 2091635, + 2091831, 2092002, 2092339, 2093256, 2093428, 2093647, 2093754, 2093859, + 2093991, 2094114, 2094258, 2094433, 2095314, 2095570, 2095889, 2096051, + 2096177, 2096294, 2096437, 2096585, 2097047, 2097130, 2097209, 2097298, + 2097474, 2097658, 2098105, 2098286, 2098413, 2099267, 2099429, 2099601, + 2099712, 2099849, 2100236, 2100583, 2100735, 2100877, 2101006, 2101388, + 2101556, 2102040, 2102177, 2102318, 2102480, 2102973, 2104029, 2104365, + 2105056, 2105162, 2105251, 2105412, 2105505, 2105641, 2105855, 2106030, + 2106166, 2106382, 2106550, 2106662, 2107142, 2107312, 2107574, 2107683, + 2107908, 2108000, 2108089, 2108422, 2108551, 2108915, 2109047, 2109525, + 2109961, 2110063, 2110185, 2110341, 2110627, 2110806, 2110958, 2111129, + 2111277, 2111500, 2111889, 2112018, 2112137, 2112350, 2112706, 2113023, + 2113186, 2113624, 2113712, 2113799, 2113978, 2114367, 2114548, 2114712, + 2114855, 2115641, 2115913, 2116738, 2117135, 2119022, 2119789, 2120079, + 2120505, 2123045, 2123159, 2123394, 2123597, 2124075, 2125311, 2127052, + 2128385, 2128757, 2128925, 2129165, 2129604, 2130308, 2132136, 2133161, + 2134084, 2134418, 2137549, 2138441, 2165105, 2165456, 2167151, 2168699, + 2169497, 2172182, 2174001, 2177972, 2190166, 2206856, 2219486, 2226429, + 2229544, 2231487, 2233338, 2236044, 2256656, 2259212, 2264363, 2268443, + 2268853, 2276258, 2277742, 2279972, 2280649, 2281406, 2281787, 2317335, + 2319095, 2321529, 2325366, 2326432, 2328150, 2342885, 2346627, 2356798, + 2361337, 2363005, 2364673, 2389026, 2391049, 2395406, 2396427, 2397096, + 2398521, 2403003, 2408429, 2410509, 2412080, 2415577, 2417914, 2422106, + 2422699, 2423022, 2437312, 2437616, 2441942, 2442845, 2443114, 2443484, + 2444819, 2445715, 2447366, 2454379, 2457408, 2480495, 2480855, 2481823, + 2483362, 2483708, 2484975, 2486261, 2486410, 2487347, 2488291, 2488702, + 2489166, 2490219, 2492035, 2492660, 2493509, 2493793, 2494079, 2497673, + 2500267, 2504013, 2504458, 2509815, 2510455, 2514041, 2526121, 2536864, + 2606052, 2607072, 2640242, 2641379, 2643566, 2655020, 2666196, 2667093, + 2669723, 2672831, 2676566, 2687172, 2690373, 2692877, 2699494, 2701002, + 2704792, 2708093, 2727426, 2730930, 2747177, 2749479, 2769748, 2776631, + 2777292, 2782093, 2783161, 2786058, 2787622, 2788148, 2790996, 2791124, + 2791270, 2793495, 2794156, 2795169, 2797295, 2799071, 2802426, 2804414, + 2804610, 2807133, 2808304, 2808440, 2814533, 2814860, 2815834, 2817516, + 2823428, 2823750, 2825657, 2834397, 2835271, 2837789, 2840245, 2841315, + 2843684, 2859443, 2860847, 2865351, 2869837, 2870880, 2871525, 2877765, + 2879718, 2883205, 2892201, 2892767, 2894605, 2895154, 2906734, 2909870, + 2910353, 2916936, 2917067, 2927161, 2930766, 2939185, 2948072, 2950826, + 2951358, 2951585, 2963159, 2965783, 2966193, 2966687, 2971356, 2974003, + 2977058, 2978881, 2979186, 2980441, 2981792, 2988304, 2992211, 2992529, + 2999410, 3000134, 3000247, 3000684, 3014705, 3016953, 3017168, 3018349, + 3026506, 3028079, 3032252, 3041632, 3042490, 3045698, 3047690, 3062245, + 3063599, 3063689, 3065424, 3075370, 3085013, 3089624, 3095699, 3100240, + 3109150, 3110669, 3124043, 3124170, 3125729, 3126707, 3127747, 3127925, + 3131574, 3133878, 3134739, 3141823, 3146219, 3160309, 3179701, 3180011, + 3187595, 3188531, 3196217, 3197337, 3201208, 3207743, 3207941, 3208938, + 3216828, 3218198, 3220513, 3223299, 3240683, 3249569, 3250847, 3255030, + 3259280, 3271574, 3272010, 3272562, 3290653, 3291819, 3297495, 3314780, + 3325584, 3337140, 3344393, 3345487, 3347037, 3355925, 3372029, 3376595, + 3379051, 3384352, 3388043, 3388183, 3388549, 3393912, 3394916, 3400231, + 3404251, 3417042, 3424325, 3425413, 3443371, 3444034, 3445777, 3445924, + 3447447, 3447721, 3450230, 3452741, 3457902, 3459775, 3461385, 3467068, + 3476684, 3476991, 3478589, 3481172, 3482405, 3483316, 3485407, 3485794, + 3492542, 3494278, 3495258, 3496892, 3498962, 3527444, 3529860, 3530642, + 3532672, 3534580, 3535780, 3538406, 3544143, 3584254, 3584829, 3590841, + 3594734, 3594945, 3595614, 3598930, 3599486, 3602883, 3617480, 3623198, + 3627232, 3630383, 3633091, 3637318, 3642806, 3649909, 3657121, 3658185, + 3661043, 3662601, 3666591, 3670208, 3673027, 3676483, 3680355, 3690938, + 3691459, 3692522, 3697007, 3706229, 3709823, 3710193, 3710637, 3710721, + 3717622, 3720891, 3721384, 3724870, 3729826, 3733131, 3733281, 3733805, + 3742115, 3743016, 3759954, 3761084, 3763968, 3764736, 3769881, 3770439, + 3770679, 3773504, 3775071, 3775546, 3776460, 3777568, 3777754, 3781244, + 3782006, 3785016, 3786901, 3787032, 3788195, 3788365, 3791053, 3792782, + 3792972, 3793489, 3794056, 3796401, 3803284, 3804744, 3814639, 3814906, + 3825788, 3832673, 3837869, 3838899, 3840681, 3841143, 3843555, 3854065, + 3857828, 3866082, 3868242, 3868863, 3871628, 3873416, 3874293, 3874599, + 3876231, 3877472, 3877845, 3884397, 3887697, 3888257, 3888605, 3891251, + 3891332, 3895866, 3899768, 3902125, 3903868, 3908618, 3908714, 3916031, + 3920288, 3924679, 3929660, 3929855, 3930313, 3930630, 3933933, 3935335, + 3937543, 3938244, 3942813, 3944341, 3947888, 3950228, 3954731, 3956157, + 3958227, 3961711, 3967562, 3970156, 3976467, 3976657, 3977966, 3980874, + 3982430, 3983396, 3991062, 3992509, 3995372, 3998194, 4004767, 4005630, + 4008634, 4009552, 4019541, 4023962, 4026417, 4033901, 4033995, 4037443, + 4039381, 4040759, 4041544, 4044716, 4049303, 4065272, 4067472, 4069434, + 4070727, 4074963, 4081281, 4086273, 4090263, 4099969, 4111531, 4116512, + 4118538, 4118776, 4120489, 4125021, 4127249, 4131690, 4133789, 4136333, + 4141076, 4141327, 4141975, 4146614, 4147183, 4149813, 4152593, 4153751, + 4154565, 4162706, 4179913, 4192698, 4200800, 4201297, 4204238, 4204347, + 4208210, 4209133, 4209239, 4228054, 4229816, 4235860, 4238763, 4239074, + 4243546, 4251144, 4252077, 4252225, 4254120, 4254680, 4254777, 4258138, + 4259630, 4263257, 4264628, 4265275, 4266014, 4270147, 4273569, 4275548, + 4277352, 4285008, 4286575, 4296562, 4310018, 4311004, 4311174, 4317175, + 4325704, 4326547, 4328186, 4330267, 4332243, 4335435, 4336792, 4344873, + 4346328, 4347754, 4350905, 4355338, 4355933, 4356056, 4357314, 4366367, + 4367480, 4370456, 4371430, 4371774, 4372370, 4376876, 4380533, 4389033, + 4392985, 4398044, 4399382, 4404412, 4409515, 4417672, 4418357, 4423845, + 4428191, 4429376, 4435653, 4442312, 4443257, 4447861, 4456115, 4458633, + 4461696, 4462240, 4465501, 4467665, 4476259, 4479046, 4482393, 4483307, + 4485082, 4486054, 4487081, 4487394, 4493381, 4501370, 4505470, 4507155, + 4509417, 4515003, 4517823, 4522168, 4523525, 4525038, 4525305, 4532106, + 4532670, 4536866, 4540053, 4542943, 4548280, 4548362, 4550184, 4552348, + 4553703, 4554684, 4557648, 4560804, 4562935, 4579145, 4579432, 4584207, + 4589890, 4590129, 4591157, 4591713, 4592741, 4596742, 4597913, 4599235, + 4604644, 4606251, 4612504, 4613696, 6359193, 6596364, 6785654, 6794110, + 6874185, 7248320, 7565083, 7579787, 7583066, 7584110, 7590611, 7613480, + 7614500, 7615774, 7684084, 7693725, 7695742, 7697313, 7697537, 7711569, + 7714571, 7714990, 7715103, 7716358, 7716906, 7717410, 7717556, 7718472, + 7718747, 7720875, 7730033, 7734744, 7742313, 7745940, 7747607, 7749582, + 7753113, 7753275, 7753592, 7754684, 7760859, 7768694, 7802026, 7831146, + 7836838, 7860988, 7871810, 7873807, 7875152, 7880968, 7892512, 7920052, + 7930864, 7932039, 9193705, 9229709, 9246464, 9256479, 9288635, 9332890, + 9399592, 9421951, 9428293, 9468604, 9472597, 9835506, 10148035, 10565667, + 11879895, 11939491, 12057211, 12144580, 12267677, 12620546, 12768682, + 12985857, 12998815, 13037406, 13040303, 13044778, 13052670, 13054560, + 13133613, 15075141, +]) diff --git a/experiments/mnist_ft.py b/experiments/mnist_ft.py new file mode 100644 index 0000000..c14730c --- /dev/null +++ b/experiments/mnist_ft.py @@ -0,0 +1,159 @@ +"""Experiment to patch an MNIST image-recognition model.""" +from collections import defaultdict +import random +from timeit import default_timer as timer +import numpy as np +from pysyrenn import Network +from pysyrenn import ReluLayer +from experiments.mnist_repair import MNISTRepair +from prdnn import FTRepair + +class MNISTFT(MNISTRepair): + """Attempts to patch networks to be resillient to corruptions.""" + # zigzag, fog, brightness + corruption = "fog" + def run(self): + """Runs the corruption-patching experiment.""" + network = self.load_network("mnist_relu_3_100") + + assert isinstance(network.layers[-1], ReluLayer) + network = Network(network.layers[:-1]) + + self.record_artifact(network, "original", "network") + + self.which_params = int(input("Which fine-tuning params? (1 or 2): ")) + assert self.which_params in {1, 2} + n_rows = int(input("How many rows of Table 2 to generate (1, 2, 3, or 4): ")) + for n_lines in [10, 25, 50, 100][:n_rows]: + print(f"Running with {n_lines} lines") + self.run_for(network, n_lines) + + def run_for(self, network, n_lines): + """Runs experiments for a particular # of lines.""" + experiment = f"{n_lines}_lines" + + # Get the training lines. Only use lines where the original image is + # correctly classified. + train_lines, train_labels = self.get_corrupted( + "train", n_lines, only_correct_on=network, corruption=self.corruption) + # Compute SyReNN for each line. + start = timer() + train_syrenn = network.exactlines( + train_lines, compute_preimages=True, include_post=False) + syrenn_time = timer() - start + + # Record the SyReNNs and the labels. + self.record_artifact( + train_syrenn, f"{experiment}/train_syrenn", "pickle") + self.record_artifact( + train_labels, f"{experiment}/train_labels", "pickle") + + # Unpack the SyReNNs and associated labels to points for the patcher. + points, labels = self.sample_like_syrenn(train_syrenn, train_labels) + + layer = -1 + patcher = FTRepair(network, points, labels) + patcher.batch_size = 16 + # This is just a maximum epoch timeout, it will stop once all + # constraints are met. + patcher.epochs = 1000 + patcher.momentum = 0.9 + if self.which_params == 1: + patcher.lr = 0.05 + else: + patcher.lr = 0.01 + patched = patcher.compute() + patcher.timing["syrenn_time"] = syrenn_time + + self.record_artifact( + len(points), f"{experiment}/n_repair_points", "pickle") + self.record_artifact( + patcher.epoched_out, f"{experiment}/epoched_out", "pickle") + self.record_artifact( + patched, f"{experiment}/patched_{layer}", + "pickle" if patched is None else "network") + self.record_artifact( + patcher.timing, f"{experiment}/timing_{layer}", "pickle") + + def sample_like_syrenn(self, train_syrenn, train_labels): + points, labels = [], [] + for line, label in zip(train_syrenn, train_labels): + start, end = line[0], line[-1] + points.extend([start, end]) + # We always want to include the start/end + alphas = np.random.uniform(low=0.0, high=1.0, size=(len(line) - 2)) + interpolated = start + np.outer(alphas, end - start) + points.extend(interpolated) + labels.extend(label for _ in range(len(interpolated) + 2)) + return points, labels + + def analyze(self): + """Analyze the patched MNIST networks. + + Reports: Time, Drawdown, and Generalization + """ + experiments = defaultdict(list) + for artifact in self.artifacts: + if "timing" not in artifact["key"]: + continue + # 10_lines/timing_2 + n_lines, layer = artifact["key"].split("/") + experiments[n_lines].append(int(layer.split("_")[1])) + + original_network = self.read_artifact("original") + + test_lines, test_labels = self.get_corrupted("test", None, corruption=self.corruption) + test_images = list(map(np.array, zip(*test_lines))) + print("Size of drawdown, generalization sets:", len(test_lines)) + + timing_cols = ["layer", "total", "syrenn", "jacobian", "solver", + "did_timeout", "drawdown", "generalization"] + for experiment in sorted(experiments.keys(), key=lambda n: int(n.split("_")[0])): + print(f"~~~~ Analyzing: {experiment} ~~~~") + # Get the patched data. + train_syrenn = self.read_artifact(f"{experiment}/train_syrenn") + train_labels = self.read_artifact(f"{experiment}/train_labels") + n_repair_points = self.read_artifact(f"{experiment}/n_repair_points") + epoched_out = self.read_artifact(f"{experiment}/epoched_out") + print("Size of repair set:", n_repair_points) + train_images = list(map( + np.array, zip(*[(l[0], l[-1]) for l in train_syrenn]))) + print("Size of drawdown, generalization sets:", len(train_images)) + print("Number of f-hat vertex points:", + sum((2*len(l)) - 2 for l in train_syrenn)) + + before = self.compute_accuracies(original_network, + train_images, train_labels, test_images, test_labels) + + results = self.begin_csv(f"{experiment}/analyzed", timing_cols) + for layer in sorted(experiments[experiment]): + assert int(layer) == -1 + timing = self.read_artifact(f"{experiment}/timing_{layer}") + patched = self.read_artifact(f"{experiment}/patched_{layer}") + + record = timing.copy() + record["layer"] = layer + record["syrenn"] = record["syrenn_time"] + del record["syrenn_time"] + + after = self.compute_accuracies(patched, + train_images, train_labels, test_images, test_labels) + print("\tTime (seconds):", timing["total"]) + if epoched_out: + print("\t(Timed Out)") + + record["drawdown"] = (before["test_identity"] + - after["test_identity"]) + record["generalization"] = (after["test_corrupted"] + - before["test_corrupted"]) + + print("\tDrawdown:", record["drawdown"]) + print("\tGeneralization:", record["generalization"]) + + self.write_csv(results, record) + return True + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + MNISTFT("mnist_ft").main() diff --git a/experiments/mnist_mft.py b/experiments/mnist_mft.py new file mode 100644 index 0000000..a3eb469 --- /dev/null +++ b/experiments/mnist_mft.py @@ -0,0 +1,170 @@ +"""Experiment to Modified Fine-Tune an MNIST image-recognition model.""" +from collections import defaultdict +import random +from timeit import default_timer as timer +import numpy as np +from pysyrenn import Network +from pysyrenn import ReluLayer +from experiments.mnist_repair import MNISTRepair +from prdnn import FTRepair + +class MNISTMFT(MNISTRepair): + """Attempts to MFT networks to be resillient to corruptions.""" + def run(self): + """Runs the corruption-fine-tuning experiment.""" + network = self.load_network("mnist_relu_3_100") + + assert isinstance(network.layers[-1], ReluLayer) + network = Network(network.layers[:-1]) + + self.record_artifact(network, "original", "network") + + self.which_params = int(input("Which fine-tuning params? (1 or 2): ")) + assert self.which_params in {1, 2} + n_rows = int(input("How many rows of Table 2 to generate (1, 2, 3, or 4): ")) + for n_lines in [10, 25, 50, 100][:n_rows]: + print(f"Running with {n_lines} lines") + self.run_for(network, n_lines) + + def run_for(self, network, n_lines): + """Runs experiments for a particular # of lines.""" + experiment = f"{n_lines}_lines" + + # Get the training lines. Only use lines where the original image is + # correctly classified. + train_lines, train_labels = self.get_corrupted( + "train", n_lines, only_correct_on=network, corruption=self.corruption) + # Compute SyReNN for each line. + start = timer() + train_syrenn = network.exactlines( + train_lines, compute_preimages=True, include_post=False) + syrenn_time = timer() - start + + # Record the SyReNNs and the labels. + self.record_artifact( + train_syrenn, f"{experiment}/train_syrenn", "pickle") + self.record_artifact( + train_labels, f"{experiment}/train_labels", "pickle") + + # Unpack the SyReNNs and associated labels to points for the patcher. + points, labels = self.sample_like_syrenn(train_syrenn, train_labels) + + self.record_artifact( + len(points), f"{experiment}/n_repair_points", "pickle") + + for layer in [2, 4]: + print("::::", "Layer:", layer, "::::") + patcher = FTRepair(network, points, labels) + patcher.layer = layer + patcher.norm_objective = True + # Don't stop when full repair-set accuracy is reached, only when + # holdout accuracy gets worse. + patcher.auto_stop = False + patcher.make_holdout_set() + patcher.batch_size = 16 + # This is just a maximum epoch timeout, it will stop once all + # constraints are met. + patcher.epochs = 1000 + patcher.momentum = 0.9 + if self.which_params == 1: + patcher.lr = 0.05 + else: + patcher.lr = 0.01 + patched = patcher.compute() + patcher.timing["syrenn_time"] = syrenn_time + + self.record_artifact( + patcher.epoched_out, f"{experiment}/epoched_out_{layer}", "pickle") + self.record_artifact( + patched, f"{experiment}/patched_{layer}", + "pickle" if patched is None else "network") + self.record_artifact( + patcher.timing, f"{experiment}/timing_{layer}", "pickle") + self.record_artifact( + patcher.accuracy_on_repair_set(patched), + f"{experiment}/patched_efficacy_{layer}", "pickle") + + def sample_like_syrenn(self, train_syrenn, train_labels): + points, labels = [], [] + for line, label in zip(train_syrenn, train_labels): + start, end = line[0], line[-1] + points.extend([start, end]) + # We always want to include the start/end + alphas = np.random.uniform(low=0.0, high=1.0, size=(len(line) - 2)) + interpolated = start + np.outer(alphas, end - start) + points.extend(interpolated) + labels.extend(label for _ in range(len(interpolated) + 2)) + return points, labels + + def analyze(self): + """Analyze the patched MNIST networks. + + Reports: Time, Drawdown, and Generalization + """ + experiments = defaultdict(list) + for artifact in self.artifacts: + if "timing" not in artifact["key"]: + continue + # 10_lines/timing_2 + n_lines, layer = artifact["key"].split("/") + experiments[n_lines].append(int(layer.split("_")[1])) + + original_network = self.read_artifact("original") + + test_lines, test_labels = self.get_corrupted("test", None, corruption=self.corruption) + test_images = list(map(np.array, zip(*test_lines))) + print("Size of drawdown, generalization sets:", len(test_lines)) + + timing_cols = ["layer", "total", "syrenn", "jacobian", "solver", + "did_timeout", "drawdown", "generalization"] + for experiment in sorted(experiments.keys(), key=lambda n: int(n.split("_")[0])): + print(f"~~~~ Analyzing: {experiment} ~~~~") + # Get the patched data. + train_syrenn = self.read_artifact(f"{experiment}/train_syrenn") + train_labels = self.read_artifact(f"{experiment}/train_labels") + n_repair_points = self.read_artifact(f"{experiment}/n_repair_points") + print("Size of repair set:", n_repair_points) + train_images = list(map( + np.array, zip(*[(l[0], l[-1]) for l in train_syrenn]))) + print("Size of drawdown, generalization sets:", len(train_images)) + print("Number of f-hat vertex points:", + sum((2*len(l)) - 2 for l in train_syrenn)) + + before = self.compute_accuracies(original_network, + train_images, train_labels, test_images, test_labels) + + results = self.begin_csv(f"{experiment}/analyzed", timing_cols) + for layer in sorted(experiments[experiment]): + print("Layer:", layer) + timing = self.read_artifact(f"{experiment}/timing_{layer}") + patched = self.read_artifact(f"{experiment}/patched_{layer}") + efficacy = 100 * self.read_artifact(f"{experiment}/patched_efficacy_{layer}") + epoched_out = self.read_artifact(f"{experiment}/epoched_out_{layer}") + + record = timing.copy() + record["layer"] = layer + record["syrenn"] = record["syrenn_time"] + del record["syrenn_time"] + + after = self.compute_accuracies(patched, + train_images, train_labels, test_images, test_labels) + print("\tTime (seconds):", timing["total"]) + if epoched_out: + print("\t(Timed Out)") + + record["drawdown"] = (before["test_identity"] + - after["test_identity"]) + record["generalization"] = (after["test_corrupted"] + - before["test_corrupted"]) + + print("\tDrawdown:", record["drawdown"]) + print("\tGeneralization:", record["generalization"]) + print("\tEfficacy:", efficacy, "%") + + self.write_csv(results, record) + return True + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + MNISTMFT("mnist_mft").main() diff --git a/experiments/mnist_repair.py b/experiments/mnist_repair.py new file mode 100644 index 0000000..b947aea --- /dev/null +++ b/experiments/mnist_repair.py @@ -0,0 +1,206 @@ +"""Experiment to patch an MNIST image-recognition model.""" +from collections import defaultdict +import random +from timeit import default_timer as timer +import numpy as np +from pysyrenn import Network +from pysyrenn import ReluLayer +from experiments.experiment import Experiment +from prdnn import ProvableRepair + +class MNISTRepair(Experiment): + """Attempts to patch networks to be resillient to corruptions.""" + corruption = "fog" + def run(self): + """Runs the corruption-patching experiment.""" + network = self.load_network("mnist_relu_3_100") + + assert isinstance(network.layers[-1], ReluLayer) + network = Network(network.layers[:-1]) + + self.record_artifact(network, "original", "network") + + n_rows = int(input("How many rows of Table 2 to generate (1, 2, 3, or 4): ")) + for n_lines in [10, 25, 50, 100][:n_rows]: + print(f"Running with {n_lines} lines") + self.run_for(network, n_lines) + + def run_for(self, network, n_lines): + """Runs experiments for a particular # of lines.""" + experiment = f"{n_lines}_lines" + + # Get the training lines. Only use lines where the original image is + # correctly classified. + train_lines, train_labels = self.get_corrupted( + "train", n_lines, only_correct_on=network) + # Compute SyReNN for each line. + start = timer() + train_syrenn = network.exactlines( + train_lines, compute_preimages=True, include_post=False) + syrenn_time = timer() - start + + # Record the SyReNNs and the labels. + self.record_artifact( + train_syrenn, f"{experiment}/train_syrenn", "pickle") + self.record_artifact( + train_labels, f"{experiment}/train_labels", "pickle") + + # Unpack the SyReNNs and associated labels to points for the patcher. + points, representatives, labels = self.syrenn_to_points( + train_syrenn, train_labels) + + for layer in [2, 4]: + print("::::", "Layer:", layer, "::::") + patcher = ProvableRepair(network, layer, points, labels, + representatives=representatives) + patcher.constraint_bufer = 0.001 + patcher.gurobi_crossover = 0 + patcher.gurobi_timelimit = 90 * 60 + patched = patcher.compute() + patcher.timing["syrenn_time"] = syrenn_time + patcher.timing["total"] += syrenn_time + + self.record_artifact( + patched, f"{experiment}/patched_{layer}", + "pickle" if patched is None else "ddnn") + self.record_artifact( + patcher.timing, f"{experiment}/timing_{layer}", "pickle") + + def analyze(self): + """Analyze the patched MNIST networks. + + Reports: Time, Drawdown, and Generalization + """ + experiments = defaultdict(list) + for artifact in self.artifacts: + if "timing" not in artifact["key"]: + continue + # 10_lines/timing_2 + n_lines, layer = artifact["key"].split("/") + experiments[n_lines].append(int(layer.split("_")[1])) + + original_network = self.read_artifact("original") + + test_lines, test_labels = self.get_corrupted("test", None) + test_images = list(map(np.array, zip(*test_lines))) + print("Size of drawdown, generalization sets:", len(test_lines)) + + timing_cols = ["layer", "total", "syrenn", "jacobian", "solver", + "did_timeout", "drawdown", "generalization"] + for experiment in sorted(experiments.keys(), key=lambda n: int(n.split("_")[0])): + print(f"~~~~ Analyzing: {experiment} ~~~~") + # Get the patched data. + train_syrenn = self.read_artifact(f"{experiment}/train_syrenn") + train_labels = self.read_artifact(f"{experiment}/train_labels") + train_images = list(map( + np.array, zip(*[(l[0], l[-1]) for l in train_syrenn]))) + print("Size of repair set:", len(train_images[0])) + print("Number of f-hat vertex points:", + sum((2*len(l)) - 2 for l in train_syrenn)) + + before = self.compute_accuracies(original_network, + train_images, train_labels, test_images, test_labels) + + results = self.begin_csv(f"{experiment}/analyzed", timing_cols) + for layer in sorted(experiments[experiment]): + timing = self.read_artifact(f"{experiment}/timing_{layer}") + patched = self.read_artifact(f"{experiment}/patched_{layer}") + + record = timing.copy() + record["layer"] = layer + record["syrenn"] = record["syrenn_time"] + del record["syrenn_time"] + + if patched is None: + record["drawdown"], record["generalization"] = "", "" + else: + after = self.compute_accuracies(patched, + train_images, train_labels, test_images, test_labels) + print("Layer:", layer) + print("\tTime (seconds):", timing["total"]) + + assert after["train_identity"] == 100. + assert after["train_corrupted"] == 100. + + record["drawdown"] = (before["test_identity"] + - after["test_identity"]) + record["generalization"] = (after["test_corrupted"] + - before["test_corrupted"]) + print("\tDrawdown:", record["drawdown"]) + print("\tGeneralization:", record["generalization"]) + + self.write_csv(results, record) + return True + + def compute_accuracies(self, network, train, train_labels, test, + test_labels): + """Compture train, test accuracy for a network.""" + return dict({ + "train_identity": self.accuracy(network, train[0], train_labels), + "train_corrupted": self.accuracy(network, train[1], train_labels), + "test_identity": self.accuracy(network, test[0], test_labels), + "test_corrupted": self.accuracy(network, test[1], test_labels), + }) + + @staticmethod + def accuracy(network, inputs, labels): + """Measures network accuracy.""" + net_labels = np.argmax(network.compute(inputs), axis=1) + return 100. * (np.count_nonzero(np.equal(net_labels, labels)) + / len(labels)) + + @classmethod + def syrenn_to_points(cls, syrenn, line_labels): + """Lists all endpoints in an ExactLine/SyReNN representation. + + Returns (points, representatives, labels). Representatives are + non-vertex points which should have the same activation pattern in the + network as the corresponding point. + """ + points, representatives, labels = [], [], [] + for line, label in zip(syrenn, line_labels): + for start, end in zip(line, line[1:]): + points.extend([start, end]) + labels.extend([label, label]) + representative = (start + end) / 2. + representatives.extend([representative, representative]) + return points, representatives, labels + + @staticmethod + def get_corrupted(split, max_count, only_correct_on=None, corruption="fog"): + """Returns the desired dataset.""" + random.seed(24) + np.random.seed(24) + + all_images = [ + np + .load(f"external/mnist_c/{corruption}/{split}_images.npy") + .reshape((-1, 28 * 28)) + for corruption in ("identity", corruption) + ] + labels = np.load(f"external/mnist_c/identity/{split}_labels.npy") + + indices = list(range(len(labels))) + random.shuffle(indices) + labels = labels[indices] + all_images = [images[indices] / 255. for images in all_images] + + if only_correct_on is not None: + outputs = only_correct_on.compute(all_images[0]) + outputs = np.argmax(outputs, axis=1) + + correctly_labelled = (outputs == labels) + + all_images = [images[correctly_labelled] for images in all_images] + labels = labels[correctly_labelled] + + lines = list(zip(*all_images)) + if max_count is not None: + lines = lines[:max_count] + labels = labels[:max_count] + return lines, labels + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + MNISTRepair("mnist_repair").main() diff --git a/experiments/models/README.md b/experiments/models/README.md new file mode 100644 index 0000000..c4fd6e1 --- /dev/null +++ b/experiments/models/README.md @@ -0,0 +1,4 @@ +See https://github.com/guykatzz/ReluplexCav2017/blob/186476f942829ed233e72a67a6e68adc6ad0815d/COPYING +ACAS models are licensed under CCBY 4.0 +I modified them into the ERAN format using the code at https://github.com/95616ARG/SyReNN/blob/84cef595769608a393649630b9888b6e131ddae7/models/translate_acas_model.py +The ERAN conversion script is licensed under MIT/Expat. diff --git a/experiments/models/acas_2_9.eran b/experiments/models/acas_2_9.eran new file mode 100644 index 0000000..1572ab7 --- /dev/null +++ b/experiments/models/acas_2_9.eran @@ -0,0 +1,21 @@ +ReLU +[[3.17590e-02, -1.73163e+00, -8.74419e-02, 2.46198e-01, 1.70159e-01], [2.04788e-01, 1.54263e+00, -1.44915e-01, 3.42657e-01, -4.20385e-01], [-7.20303e-03, -6.60776e-02, -1.34737e-02, -1.02165e-03, -1.92418e+00], [4.26224e-03, 6.57441e-01, 5.05933e-01, -2.43405e-01, 1.39503e-01], [-2.38069e+00, 3.64433e-02, 6.25100e-03, -3.72337e-02, -6.21462e-03], [-1.01592e-01, -2.10203e+00, -1.68368e+00, 5.28628e-01, -3.22604e-01], [-8.56859e-03, 1.28800e-01, -3.06258e+00, 2.26857e-01, -6.43075e-03], [-1.62130e-01, -9.51543e-03, -6.66873e-02, -6.97469e-01, 4.54756e-01], [-1.94758e-03, -2.45621e+00, -2.56437e-01, 3.96768e-01, -2.69345e-01], [-7.03167e-01, 2.06452e-02, 3.32877e-03, -3.33520e-02, -1.92472e-01], [-6.19844e-01, 1.02498e-01, -8.92096e-02, 7.77859e-01, -8.87706e-01], [8.82727e-02, -6.06744e-01, -1.74252e+00, -5.01028e-01, 5.50622e-01], [2.25161e-02, 1.31116e+00, 5.54675e-02, 1.80400e-01, 9.52956e-02], [3.26263e-01, -1.39139e+00, 1.23378e-01, 3.01085e-01, -5.45245e-01], [-1.23880e-01, 5.97425e-02, 4.90169e-02, 1.36575e-01, 3.42596e-02], [-6.20247e-02, 2.63086e+00, 7.71730e-01, 9.09136e-02, -2.60298e-01], [4.79038e-01, 2.69331e-01, -8.46440e-01, -3.34050e-02, 1.46664e-01], [-2.66136e+00, 1.19223e-01, -2.45131e-01, 1.14503e-01, 2.52789e-02], [-1.11910e-01, 2.31118e-01, -1.27900e-01, -8.37781e-01, 9.03312e-01], [-5.95087e-01, 1.00181e-01, 1.07487e+00, 3.10281e-01, 4.63232e-01], [6.66975e-02, 1.04186e+00, -1.38637e+00, 1.02932e-01, -2.06311e-01], [-1.80886e-01, -1.91682e-01, 3.67809e-01, -6.41283e-01, 7.52682e-01], [9.86450e-03, -8.69041e-01, 1.15434e+00, -1.30129e-01, 3.48460e-01], [2.17290e-02, 1.28442e-01, 1.89109e-02, -1.07978e+00, -2.02482e-01], [-5.61075e-03, -7.28461e-01, -1.39993e-01, 1.77784e-01, 3.29259e-01], [-2.06801e-02, 5.25462e-01, 2.12339e-01, -6.26803e-02, 1.98268e-01], [-2.82766e-02, 9.16147e-01, -1.22178e+00, -9.08048e-02, 2.64168e-01], [2.60941e-03, 1.08946e+00, -1.06754e+00, -1.17726e-02, 2.50136e-01], [2.91987e-02, 2.82137e-01, -3.22542e-01, -1.26966e-01, -6.84722e-01], [-6.29533e-05, -1.42837e+00, 1.49373e+00, 4.15997e-01, -6.11340e-01], [-2.21228e-02, 1.13180e+00, -2.66133e-01, 7.51714e-02, -6.59726e-01], [-7.27327e-01, -1.49128e-01, 2.77102e-03, 1.33677e-01, 9.50372e-02], [-1.43035e-02, -5.84230e-01, 7.82375e-01, 1.56485e-01, -4.34127e-01], [1.47155e-02, 8.66103e-01, -1.08741e+00, -9.59969e-02, 1.99876e-01], [2.55551e-02, -5.48825e-01, 1.54026e+00, 6.15600e-02, 2.38038e-01], [-3.22285e-02, -4.21609e-01, -3.23992e-01, -2.28876e-01, -1.13297e-01], [1.61573e-02, 1.84644e+00, 2.55636e-01, 2.25635e-01, -1.05505e-01], [6.09760e-02, 8.77586e-01, -1.40493e+00, 2.02471e-02, 7.83561e-01], [5.55735e-02, -4.34014e-01, -3.48002e-02, -1.67393e-01, 2.04044e-01], [4.37442e-01, 1.05189e+00, -7.68403e-01, -1.56163e-01, 3.14424e-01], [5.79094e-02, 2.23822e-01, 1.38849e-01, -1.86365e-01, 1.71985e-01], [-1.59981e-01, 9.03545e-01, -8.33153e-01, 8.06955e-02, -3.70409e-01], [-2.52766e-01, -1.67361e+00, 2.16148e+00, -2.08214e-01, 7.98023e-01], [-2.87291e-01, 1.07820e+00, -1.80353e+00, -1.15986e-01, 3.82090e-01], [1.41282e-01, 1.93135e+00, -2.17608e-01, 3.88677e-01, -5.18071e-01], [1.07432e-01, 2.56495e-01, -3.30009e-01, -4.61143e-01, 4.23958e-01], [-1.70512e-02, -1.01881e-01, -1.72361e+00, 7.07845e-01, -6.57099e-01], [3.98667e-02, 5.59591e-01, 8.94113e-01, 4.79703e-01, 2.77834e-02], [-2.25216e-02, -1.27270e+00, 1.51476e+00, -5.82114e-02, 3.88037e-01], [2.04429e+00, 2.12589e-02, -4.82790e-03, 3.08448e-03, 3.87546e-02]] +[3.13369e-01, -2.29538e-01, -6.81796e-01, 9.37459e-02, -3.70911e-01, -8.98740e-02, 2.41037e-01, -8.99729e-02, 1.20231e-02, 8.36056e-02, -7.15250e-02, 1.09455e-01, 2.11034e-01, -2.01085e-01, 3.70529e-02, -2.83455e-01, 1.36668e-01, -6.37612e-01, 9.05210e-02, -1.72603e-02, -3.15357e-01, 8.52187e-02, -4.78976e-01, -4.07736e-01, -1.19194e-01, 1.14991e-01, -4.63243e-01, -3.48663e-01, -3.51308e-01, -2.64336e-01, -2.13971e-01, -7.35065e-02, 1.38533e-01, -4.97442e-01, 1.47239e-01, 1.21170e-01, 4.69269e-02, 2.26245e-01, 2.55251e-02, 4.39761e-02, 3.86366e-02, -2.08809e-02, -3.26913e-01, -2.04925e-01, -1.19119e-01, 1.08432e-01, 2.08443e-01, -6.08107e-03, -5.05891e-01, 5.78389e-01, ] +ReLU +[[-2.74312e-01, 4.53244e-01, -2.64590e-01, -2.09235e-01, 2.62021e-01, -6.82389e-03, -1.92727e-02, -3.02871e-01, -4.34269e-01, 3.74813e-01, 6.06781e-01, -1.64066e-01, -3.66329e-01, -2.00209e-01, -2.45032e-03, 6.39766e-03, 5.53460e-01, 2.55258e-01, -1.20655e-01, 5.66855e-01, -5.08450e-01, -6.58648e-01, -1.52196e-02, -4.74349e-01, 2.30758e-02, -6.34321e-01, -6.99678e-01, 1.04320e+00, 6.60976e-01, -1.19919e-01, -9.11582e-02, 1.30008e-01, 5.07275e-01, -3.93132e-01, 1.73094e-01, -7.93119e-01, -7.14824e-01, 6.35318e-02, 1.15503e-02, 2.19275e-02, 2.15136e-01, -1.39338e-01, 1.78261e-01, 3.85188e-01, -8.27580e-02, 2.95069e-01, 2.80843e-01, -5.99651e-02, 6.84920e-02, -1.54697e+00], [2.57361e-02, -2.67017e-02, 4.22067e-03, 3.61900e-02, 3.81616e-02, -4.72989e-02, 9.91837e-04, 3.85129e-02, 1.22661e-02, -4.57941e-03, 2.80929e-02, 2.25725e-02, 5.40007e-03, -9.91005e-03, -5.90786e-04, 1.16036e-02, -2.61224e-02, -4.32062e-02, 2.99120e-02, -1.41413e-02, 1.07733e-02, -4.05311e-02, -1.18146e-02, -5.21276e-02, -4.46955e-02, -5.37016e-02, 4.49237e-02, -1.63312e-02, 2.66759e-02, 1.38447e-02, 1.42462e-02, -5.34819e-02, -4.61764e-03, -2.61813e-02, -5.71514e-02, -5.46886e-02, -4.93981e-02, -4.40978e-03, -4.13388e-02, 5.06088e-04, 1.57050e-02, -2.36796e-02, -4.11855e-02, 1.74631e-03, -6.97062e-04, -5.73225e-02, -3.75540e-02, -8.31662e-03, 3.52304e-02, -2.35572e-02], [5.41563e-02, -9.29572e-01, -1.03635e+00, -1.75234e+00, -1.83707e+00, -3.64713e-01, -3.47448e+00, 7.17576e-01, 6.73666e-01, -8.04945e-01, -9.60829e-01, -1.57100e-01, -1.20104e+00, 3.50740e-01, 3.28205e-01, -3.79261e+00, 1.98746e-01, -6.70497e-01, -6.63242e-01, -7.44162e-03, 3.72316e-02, -3.07617e-01, 1.84669e+00, -2.23216e+00, 8.13179e-02, -1.86278e+00, 2.00265e-02, -9.45235e-03, -1.27107e-02, 1.80262e+00, -1.75050e-02, -7.80906e-01, 8.88429e-01, 5.07039e-03, 7.49418e-01, -1.27719e+00, -1.96199e-01, -9.25027e-01, 2.75989e-01, -2.62926e-02, 4.20569e-01, 1.32053e-01, 1.10097e+00, 5.43070e-02, -4.02671e-01, -8.93362e-01, 3.14220e-01, -1.02056e+00, 6.82975e-01, 9.48436e-02], [-9.26302e-03, -1.31989e-02, -1.82535e-02, -3.36816e-03, -5.85637e-03, 3.36115e-02, -8.41716e-03, -4.17287e-02, -5.60062e-02, -3.64310e-02, 1.31731e-02, -3.07997e-02, 1.27109e-02, 3.41977e-02, -5.72560e-02, 9.48261e-03, 6.29837e-03, 1.41503e-02, 2.27117e-02, -4.22178e-02, 3.71888e-03, -3.04077e-02, 4.94487e-02, -3.37449e-02, -2.83657e-02, -5.72380e-02, -3.10886e-02, 8.95094e-03, -4.99342e-02, -1.43614e-02, 1.93910e-02, -4.23475e-04, 1.23839e-02, -2.80481e-02, -3.94562e-02, 1.99039e-02, -6.77798e-03, -5.43475e-02, -2.37299e-02, -1.66575e-02, -8.38282e-03, 2.45410e-02, 4.02192e-02, 2.17684e-02, -7.99754e-04, 2.60140e-02, -2.34351e-02, 3.52303e-02, -1.18366e-02, -7.92560e-03], [1.97337e-02, -2.78378e-02, -1.33920e-03, -3.08461e-02, -2.86523e-02, 4.93014e-03, -5.20992e-02, -4.29751e-02, -8.16172e-03, 7.52752e-03, -4.24203e-02, -3.70002e-02, 3.81888e-02, 3.71993e-02, 2.43449e-02, 2.74847e-02, 1.52927e-02, 3.51977e-02, -1.46072e-02, -4.61808e-02, 1.55468e-02, -1.10047e-03, 9.44666e-03, 3.40953e-02, -3.24751e-02, 1.20669e-02, -3.42583e-02, -5.30020e-02, -2.65870e-02, 7.17988e-03, -1.30110e-02, 2.17821e-02, -4.83322e-02, 7.86319e-03, -5.00492e-02, -1.51886e-02, 3.77541e-02, 9.12914e-03, 3.04110e-02, -7.65170e-03, -2.05706e-02, -4.49330e-02, 1.02705e-02, 7.74823e-03, -5.20830e-02, -4.12713e-02, 2.98018e-02, -5.42589e-02, -5.25596e-02, -5.07511e-02], [-1.03932e+00, 1.95677e-01, 2.66497e-01, -2.22579e-02, -2.68736e-01, -6.20271e-01, -6.57646e-01, -9.16265e-02, -7.82423e-02, 2.73539e-01, 6.87115e-02, 2.43624e-01, 1.05930e-01, 8.06385e-01, -3.53127e-01, 1.63901e-01, -6.31221e-01, 9.27039e-01, 1.21021e-01, -6.59907e-02, 1.06560e+00, -1.11738e-01, -8.45631e-01, 2.23564e+00, -3.75615e-01, -1.36093e-01, -2.33140e+00, -1.90099e+00, -2.85621e-01, 3.12996e-01, 6.45906e-01, -3.23748e-01, -6.44944e-01, -3.57572e+00, 7.83218e-01, 1.42319e+00, 1.84416e-01, 1.16455e-01, 1.47364e+00, -3.32077e-01, -2.51001e-01, 3.57612e-01, -3.46401e-01, -2.04745e-01, 1.24244e+00, 2.09761e-01, 8.23253e-02, 4.37517e-02, -2.40570e+00, 6.17250e-02], [-5.94752e-02, -4.14146e-02, -3.64351e-02, -1.26274e-02, -3.90686e-02, -5.67585e-03, -2.36912e-02, 2.63055e-02, 2.15041e-02, -6.73464e-02, 8.28824e-03, -2.47064e-02, -2.45990e-03, 9.48380e-03, -6.65833e-02, -2.53637e-02, 5.66615e-02, 2.83375e-02, -1.07165e-02, -2.65854e-02, -1.72135e-02, 2.52898e-02, -4.06667e-03, 9.16998e-02, 1.72340e-03, -7.60109e-02, 1.78527e-02, -4.24272e-02, -4.67082e-02, -1.71422e-03, -1.85932e-02, -3.60562e-02, 3.04387e-02, 6.70348e-02, 7.01111e-03, -2.39426e-02, -6.82711e-02, 1.84949e-02, 1.30835e-02, 3.41775e-02, -6.65936e-03, -3.11606e-02, -1.46569e-02, -1.09222e-02, -1.22880e-02, 2.82413e-02, -4.37452e-02, 3.61022e-02, 3.50702e-02, -7.37102e-03], [2.28138e-02, -3.90268e-02, -2.94233e-01, -3.75643e-02, 1.20188e+00, 1.29483e-02, -2.42111e-01, -6.97188e-01, 8.79654e-01, 1.45433e-02, 4.03536e-01, -3.69476e-01, 1.48121e-01, 1.84284e-01, 1.01160e+00, -2.86292e-04, 9.26601e-02, 1.73806e+00, -2.05405e-01, 8.65302e-01, -2.13619e-01, 3.07991e-01, 8.90323e-01, 8.47081e-01, -3.73023e-01, -7.85672e-01, 8.56536e-01, 7.86080e-01, -2.81461e+00, -9.07279e-01, -1.06334e-01, 3.45435e-01, -4.59749e-01, 2.81276e-01, -6.25968e-02, 6.64333e-01, -1.77118e-01, 6.57328e-01, 7.40383e-01, -4.15382e-01, 3.61935e-01, 8.71354e-02, -5.04935e-01, 4.17070e-01, -1.58832e-02, -1.04179e+00, -3.59125e-01, 2.65012e-01, 4.36620e-01, -3.53347e+00], [4.91652e-01, 6.10874e-01, 2.29454e-02, -3.91277e-02, 2.45841e-01, 1.69525e-01, -5.41990e-01, 4.13163e-01, -1.05995e-01, -1.95197e-01, -1.65593e-01, -8.88178e-02, -6.17620e-01, -1.01449e-01, 8.61829e-01, -8.42826e-01, -2.26913e-01, -3.37727e-01, 2.33298e-01, 1.34471e-01, 1.57176e+00, 2.78631e-01, -9.96803e-01, -4.38068e-01, 1.14219e-01, -2.80085e-01, 1.28960e+00, 3.18891e-01, 3.51585e+00, 2.47691e-01, 6.99926e-01, 2.86443e-01, 7.49305e-01, -8.71334e-01, 2.19607e-01, -4.57545e-01, -1.27760e+00, -8.19385e-01, 2.06873e-01, -2.07161e-01, -1.35413e-01, 1.70294e+00, 2.70152e-02, -2.84809e-01, -2.25714e-01, -6.24877e-01, -5.00674e-01, 7.44855e-01, -5.86736e-01, 1.04291e-01], [2.49866e-01, 1.30565e+00, 1.82624e+00, 3.73389e+00, -7.05446e-01, 8.54509e-01, 2.61065e-01, -1.57132e+00, 8.51941e-01, -1.37440e+00, -2.28411e-02, -7.04549e-02, -1.53498e+00, 3.75347e-01, -6.11741e-01, -6.29630e-01, 2.28578e-01, 1.08557e+00, 1.96112e-01, -4.94594e-01, 1.52388e+00, 4.26862e-01, -1.21733e+00, -5.13012e-01, 6.79523e-01, -2.11528e+00, 1.97831e+00, 8.85367e-01, 1.05502e+00, 7.11846e-01, 1.95694e+00, -9.69351e-01, 1.12563e+00, -2.86033e-01, -5.68255e-01, 4.42432e-01, -1.53980e+00, -6.75185e-02, 9.02231e-01, 8.00487e-01, 1.10738e+00, 5.65039e-01, 5.52051e-01, -1.68715e-01, 3.91228e-01, 6.40041e-01, 1.37784e-01, 2.14418e+00, 2.42862e-01, -3.14508e-01], [-8.45997e-01, -5.01931e-01, -1.58747e-01, 6.88746e-01, 8.27614e-01, 1.34864e-01, 5.48595e-01, -2.54902e-01, -1.79930e-01, 2.12844e-01, -1.53797e-01, -1.06890e-01, 5.29856e-01, -6.38729e-02, 4.96303e-01, -3.33890e-01, -2.28661e-01, -2.19494e-01, 5.00196e-01, -1.68155e-01, -5.15916e-01, -8.72095e-02, -8.79658e-01, 2.24497e-01, 1.34378e-01, 2.74885e-01, -5.28585e-01, -3.01811e-01, -8.16503e-01, -2.13892e+00, -3.82553e-01, 9.98278e-02, -3.00592e-01, -1.72477e+00, -1.00780e+00, -2.36236e-01, 1.53463e-01, 1.33485e-01, -4.16936e-01, 9.03254e-02, 6.92326e-01, 3.53388e-01, -1.74517e+00, 2.48599e-01, 2.39409e-01, 4.34286e-02, 1.02922e-01, 2.99302e-02, -6.90035e-01, 2.01308e-01], [4.30249e-02, -5.60281e-02, 7.44397e-02, -2.06286e+00, -4.97151e-01, -6.91333e-01, -3.75955e+00, 6.75451e-01, 2.64210e-01, 2.07053e-02, 9.71932e-01, -6.39360e-01, -1.88233e+00, 8.28514e-01, -1.22192e-01, -3.03972e+00, -9.64060e-01, -2.67326e-01, -3.82963e-01, -7.90036e-01, 7.02041e-02, 1.44454e-03, 4.13375e+00, -2.53638e-01, 4.52329e-02, -1.56232e+00, 2.24613e-02, 3.61987e-02, -1.03774e-01, 1.96505e+00, -1.13608e+00, -7.69192e-01, 1.34497e+00, 1.54814e-02, 3.54585e-01, -6.49784e-01, -2.76846e+00, -1.12490e+00, -3.61161e-01, 7.94397e-02, -1.35350e+00, 4.87997e+00, 8.64630e-01, 4.11708e-03, -9.17156e-01, -1.23610e+00, -8.14764e-01, -8.87547e-01, 2.65581e+00, 2.30260e-01], [-4.79558e-01, 6.51215e-01, 2.74416e-01, 9.22020e-04, -6.36247e-02, -2.96317e-01, 3.19718e-01, -2.30066e+00, 1.36107e+00, -1.05695e-01, -1.09513e+00, 1.81175e-01, 1.03404e+00, 1.33957e+00, 7.46302e-01, 3.97058e-01, -8.25743e-01, 8.08341e-01, -1.57362e-01, 1.58381e-01, -5.96414e-01, -6.33365e-02, -1.88980e+00, -1.54826e+00, -5.25145e-01, 1.80197e-01, -4.13323e-01, 7.71915e-02, -1.96550e+00, 9.97645e-01, 2.42986e+00, -6.59601e-01, -1.18408e+00, -6.66208e+00, 4.61241e-01, 1.46605e-01, 2.83559e-01, 5.37062e-01, -2.09808e-01, -1.69696e+00, 7.89990e-01, -1.67564e-01, -9.22464e-01, -1.13141e+00, 1.67820e-01, 5.28049e-02, 3.29293e-01, 3.44415e-01, -1.36282e+00, 3.86707e-01], [4.76432e-02, -4.36640e-02, 1.10567e-02, 9.05728e-04, -3.69610e-02, 1.62429e-03, -6.30456e-02, -6.35481e-02, -2.47237e-02, -4.60125e-02, 4.78903e-03, -3.11978e-02, 3.80171e-02, -1.76561e-02, -2.08246e-02, -1.05941e-02, -3.10631e-03, -5.76428e-02, -6.92488e-03, -3.26914e-02, -4.31413e-02, -4.65544e-02, -1.13038e-02, 4.75350e-03, -5.11425e-02, 4.24122e-02, 1.35687e-02, -2.20927e-02, 1.03513e-02, -1.83364e-02, -5.99263e-02, -1.30478e-02, 1.15290e-02, 2.09356e-02, -7.45677e-03, 4.01252e-02, -3.44275e-02, 9.13826e-03, -2.47571e-02, 1.04587e-02, 1.61386e-02, -1.30544e-02, -1.31988e-03, 3.85721e-03, -6.19006e-02, -5.31969e-02, -5.81560e-02, -4.11091e-03, 2.48224e-02, -4.66666e-02], [-1.89100e-02, -9.93853e-04, -3.63583e-03, 3.53349e-02, -2.22973e-02, -3.34289e-02, 2.03953e-02, 1.93449e-02, -3.15077e-02, -6.45897e-02, 1.94946e-02, -1.61773e-03, -1.59318e-02, 1.50482e-02, 2.40966e-02, -7.75658e-03, -3.48412e-02, 3.00635e-02, -5.22549e-02, -1.15015e-03, -5.05154e-02, -1.14929e-03, -3.03826e-02, -1.46919e-02, -5.25905e-02, -1.03318e-02, -1.40698e-02, -2.94798e-02, 9.66951e-03, 3.78652e-02, -5.95010e-02, 1.85880e-02, -2.07753e-02, -6.66987e-02, -3.39514e-02, 8.12686e-03, 2.15412e-02, 7.68784e-03, -5.85113e-02, -4.23253e-02, 9.69383e-03, -4.46057e-02, 1.49042e-03, -6.84675e-03, -3.57120e-02, -5.11493e-02, 1.85736e-02, -2.24928e-02, 8.92001e-04, 2.09210e-02], [-2.01590e-01, -3.05005e-02, 9.89869e-01, 1.79579e-01, 1.60502e+00, 1.69261e-01, -2.56771e-01, 1.38062e-01, 4.48711e-01, 1.06801e+00, -1.64680e+00, -3.01261e-01, -4.27856e-01, 1.35083e+00, -5.60771e-01, -3.92215e-01, -8.62364e-01, -6.21727e-01, -4.25459e-01, 2.69733e-01, 1.03306e+00, -3.59423e-01, -3.02407e-01, -8.45995e-02, 5.58334e-01, -7.98522e-01, -4.41174e-01, 6.63210e-02, 2.31964e+00, 5.57922e-01, -9.49382e-01, -3.80052e-01, -9.55894e-01, -3.63345e+00, 1.81161e-01, 3.32760e-01, 3.48661e-01, 1.97926e-01, 1.49968e+00, 7.80464e-01, 7.49026e-01, -6.41226e-01, -1.23850e+00, -1.13619e+00, 7.15619e-01, 1.91230e-01, 1.60381e-01, -1.84771e-01, -1.72040e+00, -6.98671e-02], [-1.19060e+00, -1.87761e-01, -1.17412e+00, -2.22613e-01, 2.39472e-01, -1.80048e-01, 4.68354e-02, 1.48328e-01, -9.59434e-01, 1.88612e-01, -1.39216e+00, -4.60758e-02, -4.67037e-01, -3.54934e+00, 1.18306e+00, 4.93974e-02, -2.55679e-01, -4.62131e-01, 9.43334e-01, 8.40601e-02, -6.64089e-01, 4.44397e-01, -7.28204e-01, 4.28054e-01, -4.36744e-01, -3.90559e-01, -2.13812e-01, 1.33343e-01, 3.52300e-01, 9.12850e-01, 4.78652e-01, -1.51965e+00, -9.18089e-01, -1.11133e+00, 8.54890e-01, 1.90973e+00, 4.91762e-01, -4.26135e-01, 4.70403e-01, -9.55152e-01, -1.60486e-01, 1.01771e+00, -4.98455e+00, 6.20854e-01, 8.18977e-01, 6.23150e-02, -1.61671e-01, 1.61142e+00, -1.60462e+00, 6.62826e-01], [-4.56485e-01, 8.56443e-01, 1.85042e+00, -5.47035e-02, 4.56502e-01, -9.03457e-02, -8.74963e-01, 3.71503e-01, 3.94512e-01, -7.92680e-01, 3.68762e-01, 2.06635e-01, 3.75058e-02, -4.50968e-01, -3.94804e-01, 6.72635e-02, -8.20297e-04, 8.89714e-03, -1.23974e+00, -2.23669e-01, 5.25303e-01, 3.43944e-01, 2.29532e+00, 3.96805e-01, 2.47657e-01, -4.38304e-01, -1.50264e+00, -4.48683e-02, -7.27554e-01, -3.13242e-01, -8.96162e-01, 4.94989e-01, 1.89078e-01, 2.69746e+00, -7.09752e-02, 1.12815e-01, -4.18909e-01, 2.75994e-01, -6.89375e-01, -7.24539e-02, -8.50014e-01, 1.55487e-01, -1.11743e+00, -3.29123e-01, -3.06785e-01, 5.94758e-01, 2.71120e-01, 1.85984e-01, 4.41250e-01, -1.93470e-01], [-3.59118e-01, 2.11101e-01, -4.15577e-01, 5.19001e-01, 5.76083e-01, 8.91322e-02, 7.74037e-02, -9.51297e-01, 1.29530e+00, 4.83728e-01, -5.40178e-01, 4.42448e-01, -5.90126e-01, 4.17922e-02, 3.93306e-01, 1.18682e+00, -3.03735e-01, -1.12761e+00, -3.12398e+00, -3.87546e-01, -4.97081e-01, -1.67975e+00, -4.13668e+00, -2.77591e-01, 1.05641e-01, 2.57945e-01, -6.10551e-03, -1.38405e+00, -8.34905e-01, 3.56785e-01, -5.49309e-01, 3.85539e-01, 1.03713e-01, 7.48026e-01, -1.09847e+00, -9.90401e-02, 1.13204e+00, 3.34977e-01, -9.49835e-01, 2.18698e-02, 2.11572e-02, 1.65866e-01, 7.69202e-01, -1.60915e-01, -4.90348e-01, -1.69564e-01, -1.43015e-01, -2.13863e-01, -1.26016e+00, 6.26699e-03], [-4.63897e-02, 2.03574e-02, 1.70291e-02, -4.39804e-02, 2.04706e-02, 4.16340e-02, 2.55966e-02, -3.36983e-02, -5.23306e-02, -4.72491e-02, 1.22897e-02, -3.06153e-02, 2.06224e-02, -2.27548e-02, 3.92802e-03, 3.39592e-03, -3.52629e-03, -2.20993e-02, -2.99076e-02, 3.61151e-02, 3.24235e-02, 1.45514e-02, 9.60994e-03, 1.35553e-03, 6.02535e-03, 8.82338e-03, -4.11970e-02, -4.07869e-02, -4.80066e-02, 1.25839e-02, -3.01520e-02, -1.22338e-02, -5.03826e-02, -2.24181e-02, -6.31595e-02, 1.43851e-02, 1.69305e-02, -3.18007e-02, -3.62116e-02, -7.44000e-03, 2.99393e-02, -5.47100e-02, -2.57296e-02, -4.97017e-02, -5.32159e-02, 2.26027e-02, -3.01413e-02, -4.49375e-02, 1.43500e-02, 1.99126e-02], [8.41456e-03, 2.01249e-02, -3.01054e-02, -1.59205e-02, -2.73582e-02, -2.16381e-02, -2.92238e-02, -7.49420e-03, -3.92951e-02, -3.13939e-02, -3.49950e-02, -5.47967e-02, -2.41297e-02, 6.32636e-03, -4.80302e-02, -4.49787e-02, -4.54464e-02, -1.66077e-02, 3.54476e-02, -1.66076e-02, 4.56490e-02, 4.67622e-04, 2.75088e-03, 2.81562e-02, 3.69715e-02, 1.22762e-02, 4.16275e-02, 4.43333e-02, 2.23485e-02, -5.57730e-02, -3.54103e-02, 2.61503e-02, -4.43770e-02, 3.41383e-02, -4.54794e-02, -4.48304e-02, -5.22925e-02, -1.08706e-02, -1.40153e-02, 3.57949e-02, 3.94194e-02, 2.69422e-02, 3.22616e-02, -3.19453e-02, -3.29505e-02, -4.84107e-02, 3.45250e-02, -3.42326e-02, 2.09921e-02, -2.01235e-02], [-5.14119e-02, 1.29128e-02, -3.81992e-02, 1.37437e-02, 6.38017e-03, -2.59990e-02, -2.28932e-02, -2.98488e-02, -4.23443e-02, -4.40351e-02, -2.38529e-02, 1.78034e-02, -4.40049e-02, 1.07202e-02, 3.94458e-03, -4.43875e-02, -2.54763e-02, -3.66471e-02, 1.85670e-02, -4.20568e-02, 3.84775e-02, -1.23648e-02, 4.05984e-02, -5.32064e-02, 1.92675e-02, -4.04310e-02, 1.84920e-03, -1.14520e-02, -4.58243e-02, -1.74654e-02, 1.45697e-02, -7.16431e-03, -1.02252e-02, -7.06732e-03, 3.53589e-02, -5.01893e-02, -4.90016e-02, 1.79753e-02, 1.17109e-02, 2.86461e-02, -3.03165e-02, 1.67875e-02, 3.20818e-05, 2.40247e-02, 2.54396e-02, -1.20681e-03, -1.30326e-02, 2.39281e-02, 3.10123e-02, -1.54025e-02], [-7.28940e-02, -4.02899e-01, -4.32997e-01, 3.71604e-01, -2.88002e-01, 3.26017e-01, -4.75565e-01, 5.53322e-01, -7.75361e-01, -7.54896e-02, 1.50609e-01, 3.17172e-01, 3.11245e-01, -1.31487e-01, 3.00960e-01, -1.76012e-01, -1.53468e+00, -4.03507e-01, -1.37750e-01, -1.31105e-01, -1.18876e+00, 1.33020e-01, 1.07690e+00, -1.41823e+00, -3.44501e-01, -1.26935e-02, -1.85012e+00, -1.31359e+00, -3.65530e+00, -1.72484e-01, -9.17940e-01, 8.03822e-01, -9.55620e-01, -1.65300e+00, -5.21283e-01, 5.46369e-01, -2.13778e-01, -5.43533e-02, 5.50162e-01, 1.34888e+00, 1.75993e+00, 4.10672e-02, -9.55579e-01, -1.37021e+00, -1.13048e-01, 6.96498e-01, 2.90443e-01, 6.19548e-01, -6.26162e-01, 3.64019e-01], [-2.18069e+00, -1.60889e-01, 1.17492e+00, -1.39892e+00, -5.17175e-01, -7.01918e-01, -1.50211e-02, -1.19944e+00, -1.44845e+00, -1.75762e-01, 7.75643e-02, -1.33937e+00, -3.45594e-01, 4.25506e-01, -1.83690e+00, -1.12561e+00, 6.56209e-01, -1.00287e+00, 2.58813e-01, -5.23932e-01, 9.51032e-01, -8.37392e-02, -2.03895e-01, 1.00312e-02, -1.11464e+00, -1.53960e+00, 3.19048e+00, 2.38258e+00, -2.45391e+00, -1.17635e-01, -8.77778e-02, -2.07173e-01, 1.96614e+00, 3.23627e+00, -4.26021e+00, -7.34659e-01, -5.76631e-02, 1.66749e-02, -2.58249e+00, 7.56376e-01, -4.09842e-01, 1.42757e+00, 3.43575e-02, 1.14243e+00, 1.54062e+00, 1.66972e-01, 3.36275e-01, -1.06167e+00, -2.25474e-01, -2.40796e-01], [1.88761e-01, -6.90306e-01, 1.95548e+00, 1.45664e-01, -2.73162e-01, 3.03100e-01, -2.80829e-01, -3.35122e-01, 8.14155e-01, 1.08379e-01, -2.64908e-01, 4.40178e-02, 2.24765e-01, -1.56712e-01, 8.00981e-01, 3.23428e-01, -8.92925e-02, 9.17403e-01, -5.71270e-01, 1.04052e-01, -9.45869e-01, -7.33759e-01, 2.20423e+00, 4.24340e-01, 5.36686e-01, 1.70637e-01, 1.71631e+00, 5.11784e-01, 2.18909e-02, -7.34094e-02, -5.82890e-01, 1.06546e+00, -3.18246e-01, 2.13480e+00, 1.17181e-01, -1.18153e+00, 4.48997e-01, 3.08753e-01, -4.01789e-01, 7.14680e-01, 4.40258e-01, -7.73367e-01, -6.27455e-02, -1.53951e-01, 3.14015e-02, -4.37386e-01, 7.83966e-01, 4.00380e-01, 1.52602e+00, 3.77452e-01], [-3.60477e-01, 2.79735e-01, 3.25113e-01, -3.56027e-02, -4.45640e-01, -9.24051e-02, -7.80429e-01, 3.61228e-01, 9.70277e-03, 1.06819e-01, -2.62385e-01, -2.72205e-02, 5.05320e-01, 9.34297e-02, 1.18104e-01, -2.07072e-01, 1.08198e-01, 2.02915e-01, -5.86645e-01, -2.28008e-01, -3.48188e-01, 1.44100e-02, 6.88693e-01, 3.88035e-01, -1.57403e-01, 6.61823e-01, 2.53688e-01, 1.47450e+00, 3.28551e+00, -5.54398e-02, 8.62222e-01, 9.48463e-02, 2.91823e-01, 8.61512e-01, 2.90744e-01, -3.13691e-01, -3.61522e-01, -2.41347e-01, 2.88096e-01, -1.22207e-02, 5.24592e-01, -2.20928e+00, -9.13758e-02, 5.22141e-01, 6.87784e-02, -1.22466e-01, 5.47359e-01, 8.59029e-01, -1.64332e-01, -2.41557e-01], [1.57575e-02, -2.66341e-02, 2.92190e-02, 4.98860e-03, -6.12347e-03, -2.16911e-02, -4.15118e-02, -4.55746e-02, -4.93785e-02, -2.39386e-02, -1.50156e-02, -1.43824e-02, -4.36520e-02, -5.22230e-02, 1.84870e-02, -7.21367e-03, 5.66627e-03, -3.31141e-02, -2.27645e-02, 1.07774e-02, -1.12350e-02, 1.19129e-02, -3.29011e-03, -1.62796e-02, -6.22804e-02, -8.87056e-03, 1.59898e-02, -4.69742e-02, -4.74205e-02, 4.93252e-03, -6.46139e-03, 1.42416e-02, -1.49531e-02, -2.66580e-02, -7.78300e-03, 3.72202e-02, -2.71952e-02, 3.09696e-02, 8.86160e-03, -1.23781e-02, -4.09646e-02, -1.85563e-02, 2.60759e-02, -3.08038e-02, 4.75992e-03, 1.01251e-02, 3.89040e-02, 2.73976e-02, -4.32420e-02, -2.19378e-02], [6.48754e-03, 9.29696e-02, 1.52361e-03, -3.21824e-01, 1.24959e-01, 1.28229e-01, -2.67937e-02, 4.86634e-01, 1.51701e-01, -3.14176e-01, -4.17531e-01, -1.80245e-02, 3.78439e-01, -2.34897e-01, 3.22379e-01, -3.78719e-01, -1.65578e-01, 9.87047e-03, -5.28242e-02, 1.57634e-01, 3.41792e-01, 3.02257e-02, 1.21134e-01, 1.38058e-01, 2.92640e-01, 1.40448e-01, -6.60697e-02, -7.72617e-02, -2.78474e-01, -3.53499e-01, 3.23925e-01, 2.82111e-02, -1.22712e-01, -1.13844e-01, -3.28099e-02, -5.49805e-03, 2.62366e-01, -6.71281e-04, 6.37950e-02, -1.64827e-01, -3.12503e-01, -1.57909e-01, 3.91909e-02, -6.81773e-02, -2.19347e-01, -5.39879e-01, 1.30794e-01, 3.13859e-01, 2.13782e-01, 9.91297e-02], [-3.51515e-02, -2.19465e-02, 3.40812e-02, 2.55226e-02, 1.48389e-02, 2.39719e-02, -3.80665e-02, -2.74052e-02, 4.54904e-03, -5.09631e-02, 1.16956e-02, 4.08019e-02, 3.98899e-02, 3.30658e-02, -5.84654e-02, 1.61735e-02, -3.65503e-02, 3.85692e-02, 3.43386e-02, -1.32102e-02, 2.57228e-02, 1.30134e-02, 3.55843e-02, -5.79338e-03, -4.46617e-02, -1.84399e-02, -2.67248e-02, 1.34336e-02, -5.51045e-02, -3.80750e-02, 1.21036e-02, 1.95063e-02, 1.65181e-02, -3.54328e-02, -3.61001e-02, -4.39928e-02, 3.14869e-03, -4.35931e-02, 3.71384e-02, 2.95443e-02, -4.72974e-02, -2.48577e-02, 2.93953e-02, 2.75955e-02, -4.67313e-03, -4.07247e-02, -5.90613e-02, -3.85906e-02, 7.09093e-03, -1.33473e-02], [1.14938e-02, 3.26300e-02, -3.09281e-02, 1.17726e-02, 4.17126e-03, 2.64468e-02, -4.94217e-02, -3.96003e-02, -8.27752e-03, 3.10098e-02, -3.23304e-02, -1.08789e-02, -3.78722e-02, 2.77194e-02, 3.34102e-02, -4.65662e-02, -3.14013e-02, -4.46604e-02, -5.89667e-03, -5.01271e-02, -6.94462e-03, -3.62414e-02, -3.27677e-02, -3.45861e-02, 4.91142e-03, 3.73738e-02, 4.33535e-03, -1.39834e-02, -4.00174e-04, 1.07436e-02, 4.26634e-02, -1.23090e-02, -2.26966e-02, 1.83488e-02, 1.99917e-02, -4.32891e-02, -2.59042e-02, -7.43855e-03, 3.16784e-02, -7.22844e-03, 2.43658e-02, -3.89256e-02, -2.42407e-02, -3.66878e-02, -4.51078e-02, -2.13831e-02, -3.93760e-02, 2.38820e-02, -4.10888e-02, -1.24507e-02], [3.38641e-01, -5.00198e-01, -2.07673e-01, 2.76687e-01, -4.92646e-01, -2.51927e-01, 1.35747e-01, 2.65379e-02, -9.55485e-02, 3.06807e-01, 3.38947e-01, -4.09733e-02, -4.78465e-02, 2.62320e-02, 2.75925e-01, 2.58346e-02, 5.70028e-02, -1.69598e-01, -1.10694e-01, 1.02247e-02, -6.48895e-01, 1.45680e-01, 3.44238e-01, 3.51122e-01, -4.51937e-01, 2.19795e-01, -5.48760e-01, -5.67859e-01, 1.76746e-01, -8.14782e-01, -2.74591e-02, -8.56243e-01, 6.55009e-01, 2.01565e-01, 3.84441e-01, -9.66191e-02, -2.07460e-01, -5.41878e-02, 2.43565e-01, 7.47065e-01, 3.92908e-01, 4.80255e-01, 2.38414e-01, 4.31751e-01, -2.11282e-01, 1.59903e-01, 1.41963e-01, 2.30753e-01, -7.41441e-01, -5.69160e-01], [-4.19389e-02, 6.02098e-03, -3.34402e-03, -2.24974e-02, -2.17893e-03, 7.35970e-03, -3.36434e-02, -3.27228e-02, -7.33735e-03, -3.75066e-02, -3.79364e-02, 2.52029e-02, 1.04705e-02, -3.96349e-02, -3.98110e-02, -8.98300e-03, -2.63292e-02, -5.09632e-02, 2.88181e-02, 1.08929e-02, 1.72443e-02, -9.99291e-04, 3.78023e-02, -4.29347e-02, 4.60604e-02, -4.67152e-02, 4.03910e-02, 2.69990e-02, 3.41602e-02, -2.48862e-02, -2.53108e-02, -4.61616e-02, -6.69464e-03, -2.31649e-02, -3.86898e-02, 1.40388e-02, -5.74192e-02, 2.21602e-03, 2.89721e-03, -2.39092e-02, 8.08721e-03, -9.94092e-03, 2.05518e-02, 1.98256e-02, -6.45169e-03, -5.18646e-03, 3.86405e-02, -6.54004e-02, 1.66693e-03, -4.99656e-03], [4.12638e-02, -1.29728e+00, 3.81749e-01, 1.15467e+00, 2.92900e-01, 5.29762e-01, 9.53003e-01, 2.01388e-01, 1.16869e+00, 2.41395e-01, -1.58181e-01, -2.05947e-01, -7.64125e-01, 7.56724e-01, -1.17347e+00, 5.60055e-01, 3.11625e-01, -1.41564e+00, 1.56483e+00, 3.24826e-01, -2.33209e+00, 7.73508e-02, -3.36636e+00, 1.42111e+00, 8.05773e-01, -3.68175e-01, -3.43389e+00, -2.33226e+00, 4.61310e-01, 5.80032e-01, -1.50381e+00, -7.76228e-01, -1.18775e+00, -5.92124e+00, -1.70241e+00, 3.31377e-01, -8.90031e-01, 5.38327e-01, -1.15374e+00, 1.15613e-01, 6.25497e-02, -1.62655e+00, -6.41210e-01, -1.44929e+00, -8.16254e-01, 9.49781e-01, 1.16273e-01, -7.65188e-01, 4.49808e-01, -1.18233e-01], [3.91992e-01, 8.17864e-01, -7.36237e-01, -2.85892e-01, 2.04657e-01, 2.39517e-01, -7.10082e-01, 1.39483e-01, 3.50412e-01, 1.53979e-01, -1.61291e+00, -1.51414e-01, -2.35559e-01, -3.47021e-01, -6.43878e-02, 2.92916e-01, -3.03358e-01, -4.57590e-01, 4.99055e-01, -8.81464e-02, 7.69675e-01, 2.23878e-01, -7.35666e-01, 2.25330e-01, 3.16863e-01, -1.46410e-01, 2.10169e-01, 1.19796e-01, 5.53510e-01, -8.94014e-02, 5.72507e-02, 5.07043e-01, 4.38296e-01, -1.41945e+00, -7.67788e-02, 5.53146e-01, 4.01557e-01, -3.15727e-02, -5.05711e-01, 4.32787e-01, -3.04997e-01, 9.71570e-01, 4.13250e-01, 5.18811e-01, 1.79168e-01, -7.72985e-02, -4.18303e-01, -2.19906e-01, -6.36431e-01, 2.01609e-01], [-2.17201e-02, -4.55655e-02, -4.61537e-02, -2.09094e-02, -2.11052e-02, -5.47418e-02, -9.68101e-04, 1.28789e-02, -6.06637e-03, 1.67638e-02, 2.70532e-02, 1.46482e-02, -4.92225e-02, -3.76072e-02, -1.54980e-02, -4.01831e-02, 8.59024e-03, 2.02577e-02, 1.57243e-02, -1.73587e-02, 3.78594e-02, -3.97209e-02, -1.74176e-02, 3.92135e-02, -2.23137e-02, 2.41778e-02, -3.88622e-02, -5.58974e-03, 1.63827e-02, 3.09542e-02, -5.63534e-03, -1.72426e-02, -2.62206e-02, 2.97664e-02, 4.86929e-04, 4.55714e-03, -6.31758e-03, -2.20684e-02, 1.77490e-03, 7.78721e-03, -2.79646e-02, -5.82166e-02, -2.10473e-02, 1.85519e-02, -5.58528e-02, 2.25853e-02, -4.08947e-02, 3.52199e-02, 3.26732e-02, -5.24781e-02], [-3.11135e-01, -1.19275e+00, 8.34499e-01, 5.91128e-01, 1.06935e-01, -5.75604e-02, 1.52322e-01, -2.88435e-01, -5.53591e-02, -5.33366e-01, 5.35055e-01, -1.02473e-01, 3.39402e-01, -9.40659e-01, 6.91682e-01, -2.01262e-01, -4.81124e-01, 1.57567e-01, 1.09502e-01, -1.16808e-01, -2.45004e-01, -1.01094e+00, -1.87487e-01, 1.13901e-01, -1.75427e-01, 9.51489e-01, 5.38416e-01, 8.18731e-01, 8.60991e-02, 4.55017e-01, 6.91051e-01, -1.57834e-01, 4.86619e-01, 4.08087e-01, -2.33549e-01, 8.30949e-01, -1.66345e-01, 2.35651e-01, 4.66570e-01, -3.22897e-01, 6.97712e-01, 3.94906e-01, -4.81395e-01, -4.89776e-01, -3.53276e-01, -2.16871e-01, 3.16066e-01, -1.83224e-02, 5.48855e-01, -1.85468e-01], [3.09872e-01, -1.06137e+00, 7.11050e-01, -8.70874e-01, 1.80779e+00, -9.93606e-01, 2.74666e-01, 2.88282e-01, -2.66274e-01, 9.07304e-01, -3.15419e-03, -1.76602e-01, -2.39981e-02, -1.92207e-01, 4.06780e-01, -1.18726e-01, 3.59958e-01, 6.82801e-01, 1.79129e-01, 6.04521e-01, 1.15986e-02, 2.86246e-01, 1.26064e-02, -1.64845e-01, -2.50673e-01, -7.60911e-01, 1.49825e-01, -1.52745e-01, -9.85073e-01, -3.58635e-01, 5.16154e-01, 1.89233e-01, 1.72788e+00, 1.32275e+00, 6.45547e-01, -7.61888e-01, 1.60110e-01, 2.94357e-01, -9.43986e-01, -1.38609e-02, -2.35768e-01, 3.78565e-01, 7.35794e-01, 1.18986e+00, -2.00746e-01, 5.84396e-02, 6.59394e-01, 5.43859e-02, -2.12449e-01, -3.22236e+00], [8.48514e-03, 3.65542e-02, -1.56654e-02, -1.09714e-02, -1.51789e-02, -5.06604e-02, -3.92124e-02, -3.34810e-02, 1.35086e-02, -3.34114e-02, -1.17774e-03, -8.63831e-03, 3.34922e-02, -5.37049e-02, 4.53817e-03, 1.35231e-02, 1.24357e-02, 1.97474e-02, -4.25671e-03, -5.47473e-02, -1.20477e-03, -3.62485e-02, 4.02498e-02, -3.22084e-02, -4.18360e-02, -2.70907e-03, 4.04339e-02, -2.20620e-02, 2.35139e-02, 1.87208e-02, 2.33523e-02, -3.51724e-02, 9.38908e-03, -4.52613e-02, -1.69301e-02, -8.92025e-03, -3.00441e-02, -2.29335e-02, 1.51072e-02, -3.48772e-02, 2.14832e-03, 4.07462e-02, -4.92520e-02, -5.47235e-02, -4.84436e-02, -5.43006e-02, -1.42370e-02, -9.58442e-03, -2.08181e-02, -2.87824e-02], [-5.76885e-01, -1.09167e+00, 6.09857e-01, 2.66263e-01, -4.31221e-01, 7.74133e-02, 4.87465e-01, 6.34386e-01, -6.83230e-01, 1.32083e+00, -2.35838e-01, 5.56386e-01, 4.71956e-01, 2.89403e-01, 9.37659e-01, 6.22147e-01, 4.32648e-01, -9.89817e-01, 2.02938e-01, 9.39039e-03, 3.34109e-01, -4.32308e-02, -3.36993e-01, -4.26535e-01, 1.55081e+00, 4.16026e-01, 1.87667e-02, -3.94888e-01, -4.80034e-01, 1.38047e+00, -1.18544e+00, 1.40696e+00, 5.68657e-01, 1.16998e+00, -1.63937e-01, 6.63622e-01, 5.24144e-01, -5.21591e-01, -6.65167e-01, 5.24857e-02, 5.08808e-01, -8.46604e-01, 3.84857e-01, -3.91466e-01, -1.55835e-02, -9.49807e-02, 4.61468e-01, -2.16404e+00, 1.85008e-01, 6.34402e-02], [-5.41312e-02, -4.82744e-02, 3.34497e-02, 2.45827e-02, -8.79897e-03, -2.45644e-02, -1.54185e-02, -2.43535e-02, 2.28186e-02, -6.26189e-03, 8.25208e-03, -2.02196e-02, -3.53655e-02, -1.66359e-02, -1.91473e-02, 3.43669e-02, 6.73185e-03, -4.11943e-02, -2.52904e-02, -2.66500e-03, -8.99784e-03, 3.52028e-02, -9.32707e-06, -1.11622e-02, -4.51316e-02, 3.44690e-02, -4.79810e-02, 8.16331e-03, -2.24191e-03, -1.92418e-02, 4.15042e-02, -1.51545e-02, 4.88108e-03, -5.26386e-02, -3.34843e-02, 1.33765e-02, -4.06552e-02, -3.51044e-03, 1.22984e-02, 6.75207e-03, -1.02844e-02, -7.45223e-03, 7.83052e-03, -2.48512e-02, -1.71531e-02, -2.33309e-02, 1.24303e-03, 9.17314e-04, -3.02409e-02, -8.85133e-03], [3.91378e-01, -2.94451e-01, -3.75459e+00, 1.54936e+00, -1.17842e+00, 1.34691e+00, 2.72605e-01, 6.24759e-01, -1.48431e+00, -6.67699e-01, 2.84518e-01, 1.24187e-01, 7.57767e-01, -6.45883e-01, 1.88096e-01, -6.04809e-01, -1.73354e+00, 2.57982e+00, 8.64732e-01, 4.50673e-01, -1.21771e+00, 4.19065e-01, -4.50993e+00, 4.07726e-01, -2.82901e-01, 7.04154e-01, -5.56354e+00, -1.08342e+00, -1.28999e+00, -1.08551e+00, 2.44870e-01, 8.60787e-01, -1.95361e+00, -6.43540e+00, -9.54131e-01, 2.34613e+00, -3.96011e-01, -7.64787e-01, 6.19252e-01, -2.44543e-01, 1.28092e+00, -9.77154e-01, -1.62792e+00, -2.73654e+00, -1.64480e+00, 6.84865e-01, -1.41219e+00, 5.99573e-01, -2.99165e+00, 2.29829e-01], [-4.84184e-01, 8.51789e-01, -5.16806e-01, -5.95217e-01, 9.35383e-01, -9.66439e-01, 6.88145e-01, 9.55264e-01, -3.61554e+00, -1.59502e+00, -1.22572e+00, -1.15811e-01, 2.99742e-01, 1.75667e-01, 8.90595e-01, 7.77705e-01, 1.35180e+00, -5.41904e-01, 5.72719e-01, -1.14957e+00, -5.66025e-01, 2.86040e-01, 2.18341e-01, 2.70655e-03, -2.53610e+00, 1.77066e-01, -1.45743e+00, 8.14792e-01, 1.49508e+00, 1.10408e+00, 8.32365e-01, 6.24050e-01, 1.22509e+00, -4.01749e+00, 6.12527e-01, 1.46084e+00, 1.07383e+00, 3.65478e-02, 1.13132e+00, -4.42534e-01, -8.13908e-01, -4.46817e-01, 2.77246e-01, -1.75083e+00, 6.07667e-02, -4.87472e-02, 7.52235e-01, -1.24523e+00, -1.18982e-01, -3.84501e-01], [-6.12468e-01, -2.11449e-01, 4.34090e-02, 2.91675e-01, 8.76802e-02, 4.92928e-02, -6.48265e-01, -1.18123e+00, -8.35298e-01, 1.11450e-01, -2.09193e+00, -5.14150e-01, 8.27252e-02, -2.72927e+00, 8.32651e-01, 2.44334e-02, -5.65227e-01, -1.07690e-01, 1.03916e+00, 3.72792e-01, -4.97275e-01, 9.19016e-01, -1.83518e+00, -8.28440e-01, -1.70374e+00, 1.52593e-01, -6.21092e-01, 1.48262e+00, 9.78988e-01, -1.30129e+00, 1.03647e+00, -5.18309e-01, -2.23401e+00, 1.04066e+00, -1.73864e+00, -4.57501e-01, 2.05928e-02, -3.06605e-01, -2.16857e+00, -9.72793e-01, 1.31762e-01, 5.02448e-01, -1.51759e+00, 2.10734e-01, -1.68065e-01, -2.06317e-01, -5.45237e-01, 1.87018e+00, -9.22028e-01, 6.31169e-01], [1.98971e-01, -5.99317e-01, 2.12096e+00, -1.41419e+00, -1.21862e+00, 6.52972e-01, 2.66951e-01, -7.98349e-01, 3.31328e-01, -2.60286e-01, -2.01960e-01, -1.35797e+00, -2.41469e+00, 1.14555e+00, -4.26822e-01, -3.83121e+00, -6.50317e-02, 1.94371e-01, -5.60341e-01, 1.24107e-01, -1.29371e-01, -7.14487e-01, -1.06316e-01, 2.71656e-01, 2.08458e-01, -1.23457e+00, -1.98616e-01, -3.00735e+00, 2.42595e-01, 1.01138e+00, -3.52312e+00, -1.07481e+00, 8.45073e-01, -6.95500e-02, -2.83658e-01, 3.42862e-02, -2.46368e+00, 5.56515e-01, -1.84638e+00, -2.45647e-01, 6.81091e-01, -1.43322e+00, 5.57211e-01, -4.25152e-01, -1.78637e+00, 9.65450e-02, 1.20470e+00, -2.26016e-01, 1.82489e+00, -5.08204e-02], [5.98802e-01, -9.63721e-01, -3.49655e-01, 1.11760e+00, 9.29999e-02, 5.76200e-01, 2.05625e-01, -6.51402e-03, 8.68967e-01, -4.16388e-01, -1.73330e-01, 4.45473e-01, -1.68652e-01, 3.32900e-01, -5.19858e-01, 2.12917e-01, 3.49054e-01, 1.01911e-01, 1.03390e+00, -2.35731e-01, -1.06074e+00, 6.61253e-01, 1.36770e-01, 2.26360e-01, -6.84343e-02, 4.79897e-01, -3.30498e+00, -3.33063e+00, -2.99693e+00, 1.12731e+00, 2.24095e-02, -5.94030e-01, -6.14486e-01, -3.95022e+00, -7.35536e-01, 5.55479e-01, -2.61831e-01, 1.96022e-01, -1.35450e-01, -3.01185e-01, 8.32555e-01, -1.27348e+00, -3.55783e-01, -6.22932e-01, -8.22885e-01, 8.30593e-01, -6.22441e-02, 4.04134e-01, -3.50164e-02, 1.32207e-01], [2.91416e-01, 1.27632e+00, -3.89126e+00, 1.65886e-02, -1.52874e+00, 3.87118e-01, -2.90629e-01, -7.07104e-01, -2.90492e-01, 4.29078e-02, -7.96008e-01, 8.31548e-02, 8.79501e-01, -1.19060e+00, -2.15779e-01, -4.51941e-01, 4.09185e-01, 1.95057e+00, 7.05282e-01, 5.49936e-01, -2.20445e+00, 7.01527e-01, -4.27602e+00, -6.04844e-01, 3.62512e-01, 9.43427e-01, 7.93755e-01, -1.24825e-01, -1.64028e+00, -2.42465e+00, 1.39195e+00, -1.68549e+00, -1.94764e+00, 1.98400e+00, 1.57895e-01, -8.30002e-01, 1.21350e+00, 3.03705e-01, -4.18655e-01, -4.27528e-01, -1.57674e-01, -1.06973e+00, -1.38106e+00, -1.42997e+00, 1.14071e+00, 9.34971e-01, -5.69405e-01, 5.68854e-03, -3.37117e+00, 4.16630e-02], [1.52036e-01, 6.23348e-01, -3.08634e+00, -1.82146e-01, -2.53844e-01, -4.17105e-01, -2.36275e+00, -7.76986e-02, -1.39007e+00, -3.53199e-01, -1.96433e-01, 9.83814e-01, 1.55412e+00, -1.05309e+00, -4.83574e-01, -1.34062e+00, -5.99056e-01, -3.46459e-01, 1.36842e+00, 1.35319e-01, -3.20624e+00, 2.11837e+00, -5.31248e+00, -6.46149e-01, -3.61679e-03, 4.11741e-01, -3.06005e+00, -2.45175e+00, -3.27076e-01, -2.26877e+00, -2.58512e-01, -2.86187e-01, -8.20620e-01, -6.31948e+00, 7.74700e-01, -9.88049e-01, 1.05909e+00, -8.39357e-01, 5.83331e-01, -5.90053e-01, 3.28579e-02, -2.98121e-01, -1.14159e+00, -1.50244e+00, 1.00035e+00, -8.70757e-01, -1.87424e+00, 1.16205e+00, -4.58043e+00, 2.64699e-01], [-1.26929e+00, 1.42761e+00, -2.16630e-01, -1.42595e-01, -7.50935e-01, -3.80659e-01, -5.00337e-01, 2.02864e-02, -2.00616e+00, -3.48694e-01, -1.39783e-01, -8.89733e-02, 7.77977e-01, -1.52861e+00, 8.00016e-01, 8.70777e-02, -3.56734e-01, 4.55150e-01, -1.69012e-01, 3.97088e-01, 2.08315e+00, 5.14390e-02, -7.52025e-01, -2.81173e-01, -2.97128e-01, 3.12282e-01, 2.65205e+00, 3.14332e+00, 3.07190e+00, -2.00642e+00, 1.10400e+00, -1.45403e+00, 7.85137e-02, 3.50622e+00, 1.31074e+00, -6.83227e-01, 8.24461e-01, -8.78895e-01, 1.84468e-01, -5.60225e-01, -2.96790e-02, 8.09648e-01, -8.58770e-01, -7.16141e-03, 1.33175e+00, -5.95730e-02, 4.04473e-01, 1.18873e+00, -2.10986e+00, 3.07307e-01], [-1.44556e-01, 3.74210e-01, -1.61343e+00, -7.01327e-01, -4.47236e-01, 5.93765e-01, 5.05811e-01, -5.45942e-01, 6.90584e-02, -4.02582e-01, -1.34866e-01, 6.20118e-01, 1.99075e-01, 6.39588e-01, 5.88207e-01, 2.66338e-01, -2.35213e-01, 3.50009e-01, 8.59592e-02, -1.30187e-01, -4.10306e-01, -1.50000e-01, -1.03141e+00, -2.40160e+00, 1.74839e-02, -2.99900e-01, -5.14650e-01, 1.25561e+00, -1.09047e+00, 6.91848e-03, -5.32451e-01, 1.33303e-01, -1.78111e+00, -1.54051e+00, -1.44867e+00, 1.21801e-02, -1.52971e-01, -3.04912e-01, -9.84164e-01, -5.64727e-01, -1.45745e+00, -1.41288e+00, -1.01387e-01, 5.40590e-01, -8.37527e-02, 3.76620e-01, -4.31556e-01, -2.89164e-02, -2.47296e-01, -1.19634e-03], [9.52613e-02, -3.19858e-01, -5.12150e-01, -4.46647e-01, -3.08780e+00, -2.10576e-01, -7.30736e-04, 1.15985e-01, -2.36900e-01, -2.32345e-01, 2.83103e-01, 7.90448e-02, 2.80589e-01, -8.17626e-02, 2.77623e-01, -1.44259e-01, -1.01211e-02, -1.70128e+00, 9.19667e-02, 2.90288e-01, -6.07491e-01, -7.36089e-02, 6.43427e-02, -4.15892e-01, 5.56470e-02, -1.41034e-01, -1.59436e-01, -3.79429e-02, -6.63464e-01, -4.04454e-01, 6.60851e-02, -4.76752e-01, 5.83038e-01, -2.34489e-01, 2.60731e-01, -5.50546e-02, -3.48927e-01, 4.07365e-01, -6.11005e-01, 5.79880e-01, -1.90376e-01, 1.74820e-01, 1.92513e-01, 1.83183e-01, 1.95665e-01, 3.68903e-02, 3.98347e-01, -5.16000e-02, -2.77794e-02, 1.73343e+00]] +[3.20441e-01, -6.30299e-03, -1.17314e+00, -1.07769e-02, -9.83795e-03, 2.56141e-01, -5.56057e-02, -9.98774e-01, 4.39981e-02, -2.32287e+00, -4.81135e-01, -1.24988e+00, 8.59430e-01, -6.95779e-03, -3.49450e-02, 5.85689e-01, -9.39832e-01, 8.82366e-01, 1.93607e-01, -2.27493e-02, -6.57437e-03, -1.97879e-02, 8.80726e-01, -3.16322e-01, 7.31710e-02, -1.79227e-02, -2.13240e-02, -2.41186e-01, -2.98085e-02, -6.27086e-03, -1.86483e-01, -1.89651e-02, 3.17183e-01, -4.77076e-01, -1.14360e-02, -3.18617e-01, 2.01366e-01, -8.42177e-03, -1.50377e+00, -1.18258e-02, 1.61996e+00, -1.15590e+00, 3.29061e-01, -2.45473e-01, -1.74814e-01, 2.33656e+00, 9.43339e-01, -1.90151e-01, 7.49185e-01, 1.36450e+00, ] +ReLU +[[1.33037e-01, -1.09279e-02, 5.89114e-01, -4.46154e-03, -2.22375e-02, 6.78440e-02, -2.14547e-02, -8.06179e-01, 1.02241e+00, 3.06808e-01, 1.68520e-01, 7.06860e-01, -2.76869e+00, 1.09069e-02, -3.94205e-02, -6.82721e-01, -1.97350e-01, -2.44404e+00, 7.29885e-01, -3.45964e-02, -2.53708e-02, 2.17206e-02, -2.33062e-01, 3.61028e-01, -1.04387e-01, 5.47287e-01, 4.04958e-02, 4.74199e-01, -5.42502e-02, -5.97753e-03, -1.64685e+00, -2.79783e-02, -6.52812e-01, -8.74391e-01, -1.30146e-02, 9.52670e-01, -3.96457e-02, 2.00341e-02, 5.88637e-01, -3.18941e-02, 2.13349e-01, -1.04711e-01, -2.30321e-03, -1.59770e+00, -5.40474e-01, -6.34777e-01, -2.78054e-02, -2.93556e-02, 1.45068e+00, 7.49659e-02], [1.79371e+00, -3.90708e-02, -1.55054e+00, -3.36479e-02, -2.70437e-03, 5.39181e-01, -1.61426e-02, 1.17010e+00, -2.69787e+00, 6.74380e-01, -1.85009e+00, 1.23715e+00, -3.91772e-01, 5.07770e-03, 4.16616e-02, -7.45111e-01, 1.81519e+00, -1.10407e+00, 1.00798e+00, -3.75453e-02, 1.15470e-02, 3.10181e-02, 4.81061e-01, 2.78197e-01, 4.37758e-01, 2.86376e+00, -3.34488e-02, -4.10854e-01, -4.58725e-03, -4.20579e-02, -1.10361e-01, 5.38086e-02, 1.57643e+00, -2.09575e-01, 1.23224e-02, -1.03127e+00, 1.66540e-01, -1.23658e-02, 2.06509e-01, -3.45150e-02, 1.14705e+00, 6.31500e-01, 9.30500e-01, -1.57081e+00, 5.75916e-01, 3.71913e-01, 1.85146e+00, 2.13988e-01, 6.64348e-01, -2.12505e-02], [-2.75767e-01, 2.30477e-02, 7.84869e-01, 5.50060e-03, 3.41191e-02, 8.01456e-01, -4.83805e-03, -2.21763e-02, -3.42959e-01, 5.69623e-01, -1.32672e+00, 1.19394e+00, -1.74920e-01, 3.54678e-02, -5.17102e-02, 1.01027e+00, 2.77763e-01, 8.69303e-01, 1.44600e+00, 1.47892e-02, -2.08204e-02, 2.42822e-03, 5.69675e-01, 3.82649e-01, -4.38718e-01, 1.12661e+00, -1.84518e-02, 4.50310e-01, 1.26723e-02, 5.08547e-04, 8.87014e-01, -2.59376e-02, 9.90397e-01, -4.88774e-01, -6.50690e-03, 1.20043e+00, -3.72183e-01, 2.48067e-02, 1.08823e+00, -3.39732e-02, 1.94824e-01, 2.86194e+00, -2.22113e-01, 8.46041e-01, 3.49497e-01, 1.81883e-01, 1.32896e+00, 8.70589e-01, 7.65029e-01, 1.17144e-02], [5.87838e-02, -2.09733e-02, 1.13645e-01, 8.58151e-03, 4.21138e-02, 3.11295e-01, -2.10820e-02, 5.01689e-01, -3.79093e-01, 8.54993e-02, -6.46730e-02, 4.88523e-01, -4.71063e-01, 5.40536e-02, -6.74553e-03, 3.72241e-01, -3.52442e-02, 1.03048e+00, 1.79330e-01, 3.23841e-02, 2.12844e-02, 3.17071e-02, -2.55286e-01, -3.52817e-01, -3.16069e-01, -7.91409e-02, 2.55209e-02, 4.48636e-01, 3.78384e-02, -8.50494e-04, 3.99299e-01, -2.64971e-02, 1.31570e-01, 8.74311e-01, 1.24021e-02, 1.84504e+00, 4.58923e-01, 1.47367e-02, -9.43914e-02, -1.07566e-02, -3.95096e-01, 4.20199e-01, 2.23785e+00, 1.06154e-01, -2.54666e-01, 2.45360e-01, 3.77085e-01, -2.74314e-02, -4.73000e-01, -2.07645e-01], [4.94364e-01, -1.71423e-02, 9.40724e-01, 1.92159e-02, -2.15817e-02, -2.16954e+00, -4.41475e-02, -1.39515e+00, -1.98481e+00, 6.07255e-01, -5.94313e-01, 3.40988e-01, -1.45002e+00, -4.24613e-02, -2.69167e-02, -1.66466e+00, -1.75859e+00, -2.54908e+00, -1.10786e+00, -1.99395e-02, -3.61362e-02, -4.95466e-02, -3.87677e+00, -2.31435e+00, -2.83316e-02, -2.64103e+00, -2.62807e-02, -2.94966e-02, -2.30413e-02, 3.11385e-02, -1.81795e+00, -1.58140e-02, 1.91732e-01, -9.07095e-01, -1.87969e-02, -6.20828e+00, 2.88606e-01, -3.04139e-02, 7.90403e-01, 4.44296e-02, 1.80481e+00, 1.95630e+00, 3.40243e-02, -7.61619e-01, -4.98317e-01, -9.16501e-01, 1.66402e+00, -7.64144e+00, -1.13125e+00, 1.27519e+00], [1.48527e+00, 1.84085e-02, -1.49453e-01, 2.49512e-02, -3.16336e-02, 2.45816e-01, 1.47059e-03, 7.89349e-01, 9.82534e-01, -2.36526e-02, 1.73690e+00, -9.06588e-01, -4.50794e-01, 3.52563e-02, 4.07824e-02, 6.65238e-01, 1.02800e+00, -1.63593e-02, -1.84833e-01, -1.92447e-02, 3.96318e-02, -2.33230e-03, 5.11244e-01, -3.41922e+00, -2.57346e-01, 3.47703e-01, 4.21058e-02, 3.44191e-01, 4.64776e-04, -9.41743e-03, 1.08306e+00, -1.49045e-02, 1.16525e-01, 7.59932e-01, -4.96050e-02, 3.17237e-01, 1.79522e-01, 4.55590e-02, 1.36003e+00, -2.04539e-02, 3.19543e-01, -1.51170e-01, -7.47173e-02, 1.31824e-01, 5.33806e-01, -2.47470e-01, 2.83736e-01, 4.60396e-01, 5.01768e-01, 1.42240e-01], [9.86220e-01, -2.65037e-02, 4.99701e-01, -1.85730e-02, -3.62430e-02, 1.25134e-01, -3.12966e-02, 1.33941e+00, -1.54342e-01, 6.71480e-01, -2.07494e-01, -1.22439e-01, -4.53501e-01, 2.23367e-02, -3.85196e-02, 1.41717e-01, -1.81783e-02, -9.10438e-01, 8.40152e-01, 3.94982e-02, -3.47928e-03, -9.90398e-03, -1.33392e+00, -1.36844e+00, -3.87287e-01, 1.88823e+00, 5.41691e-02, 5.10465e-01, -7.86682e-03, 1.24843e-02, -3.38418e+00, -1.27474e-02, 5.57362e-01, 6.90470e-01, -3.67214e-02, 1.53184e+00, -7.70277e-02, -1.50434e-02, -5.74111e-01, 4.03404e-02, -1.42500e+00, 4.91813e-01, 6.01996e-01, 6.23301e-01, -1.35493e-01, -1.82879e-01, -2.75169e+00, 6.40089e-01, 1.61224e-02, 9.15500e-01], [2.29898e-01, -2.12681e-02, 5.56274e-02, 1.22440e-02, 2.12974e-02, -1.75844e-01, -4.29531e-02, 1.01300e+00, 1.15846e-01, -1.38998e-01, -1.09120e-01, 2.09366e-02, -1.68570e-01, -1.19690e-02, -2.51117e-02, -2.60751e-01, 1.56581e+00, 3.17617e-01, 2.21147e-02, -1.88728e-02, 6.29500e-03, -2.30746e-02, -1.19317e+00, 7.77378e-02, -7.92515e-02, 4.18948e-01, -6.95004e-03, 2.78377e-01, 2.74792e-02, 2.73444e-02, -5.16319e-01, -5.53095e-03, 2.21121e-01, 2.44327e-01, -1.53513e-03, 1.15158e+00, 3.65103e-01, 3.17539e-03, 1.23792e+00, -2.45249e-02, -7.88207e-02, 5.55271e-02, 1.51291e-01, -3.40789e-01, 3.81930e-01, 2.70496e-01, 1.89613e-01, -2.21565e-01, 4.04466e-01, -3.97255e-01], [-4.06254e-03, -1.10005e-02, -4.05361e-02, 5.07279e-03, 4.34811e-02, 4.03939e-02, 4.39809e-02, -3.21471e-02, -5.58222e-02, -1.31909e-02, -5.25469e-02, -2.92259e-02, -5.56867e-02, 1.15928e-02, -1.48384e-02, -5.57514e-02, 3.04414e-02, -4.46528e-02, 4.44516e-02, -1.11032e-02, 3.90225e-02, 2.67113e-02, -5.76519e-03, -8.88308e-03, -2.77687e-02, -4.33913e-02, 1.39706e-03, -3.30423e-02, 2.22194e-02, -3.46395e-02, 2.84248e-02, -3.28570e-02, -4.73129e-02, 1.42953e-02, -2.76608e-02, 3.73317e-02, -1.90846e-02, 2.35897e-02, -7.92151e-03, -9.77279e-03, -2.92056e-02, -3.59239e-02, -3.67681e-02, 2.48241e-02, -3.23349e-02, 2.14667e-03, -6.34952e-02, -5.18989e-02, -1.36614e-02, 1.38610e-02], [-1.14224e+00, 4.13097e-02, -4.47238e-01, 1.72639e-02, -3.65129e-02, -1.56675e-02, -1.80900e-02, 8.75695e-01, 1.17519e+00, 3.70771e-01, 7.08839e-01, 6.50737e-02, 9.45088e-02, -5.18334e-02, 2.56070e-02, 1.05202e-01, -1.53648e-01, -6.61945e-01, -9.34923e-02, 6.37774e-03, -2.55245e-03, -3.78809e-02, -1.46119e-02, -5.56367e-01, -3.94655e-01, -1.06238e-01, 1.47258e-02, 7.67900e-02, 4.66005e-03, -3.62384e-02, -3.37204e-02, 3.96076e-02, 3.50924e-01, 2.39188e-02, -2.98583e-02, -2.63343e+00, -3.31526e-02, 5.37894e-03, 2.38763e-01, 6.48834e-03, -4.88913e-01, 7.35288e-01, 7.19776e-01, 6.31962e-01, 4.41554e-01, 6.09942e-02, -3.76227e-02, 1.07462e+00, -1.96972e+00, -3.62906e-02], [9.77043e-01, -3.96964e-02, 5.45752e-01, -1.90158e-02, -2.61721e-02, -3.50293e-01, -2.37211e-03, -3.13469e-01, 1.25047e-01, -1.03073e-01, 1.14169e+00, -3.03523e-02, -3.64811e-01, -1.57506e-02, 1.49171e-02, -3.39419e-01, 1.47868e+00, 9.82588e-01, -2.76279e-01, 1.74455e-02, 2.13968e-02, -4.96176e-02, -8.09533e-01, 1.16886e-01, -5.73248e-01, 1.25433e+00, -4.62651e-03, -9.62657e-02, 3.58339e-02, 2.89565e-03, 7.55007e-01, 6.53080e-03, 2.50356e-01, 1.00491e+00, -1.75161e-02, 1.93140e+00, 3.70084e-01, -2.36760e-02, -1.57883e-01, -2.47421e-02, -3.91243e-01, 2.53078e-01, -4.19802e-01, 2.66998e-01, -5.74089e-01, 7.93755e-02, 4.73435e-01, -2.16180e-01, -4.10469e-02, -1.23997e-01], [6.92158e-01, -5.09731e-02, 3.13453e-01, -4.12843e-02, 3.52623e-02, -5.53171e-01, 2.57590e-02, 1.17104e-02, 6.54743e-01, -6.80861e-02, 8.92425e-02, -5.67805e-02, 2.13693e-01, -1.17762e-03, 1.14304e-02, 3.39065e-03, -2.73907e-01, -7.34850e-02, 2.52470e-01, 5.30109e-02, -4.05088e-02, -3.52604e-02, 7.14847e-01, 5.06683e-01, -2.43247e-03, 3.90830e-01, 1.75190e-02, 1.08946e-01, 3.90311e-02, -4.05475e-03, 1.22452e-01, 4.98954e-02, -3.02249e-02, 1.29481e-01, 3.26374e-02, 3.93132e-01, -4.23723e-01, 2.63170e-02, 8.88730e-01, 3.57219e-03, 1.27307e-01, 5.19401e-01, 1.47261e-01, -1.50371e-01, -1.96124e-01, 1.78708e-01, 3.23220e-01, -1.75302e-01, 1.64698e-01, -1.95232e-01], [2.75572e-01, 3.85232e-02, 2.04860e-01, 1.79538e-02, -4.74196e-02, -3.12114e-01, 6.34228e-03, 3.37206e-01, -3.64472e-01, -1.98125e-01, -6.07664e-01, 1.41292e-01, -6.76205e-02, -2.42865e-02, -1.18507e-03, 1.87840e-01, -2.85620e-02, 4.07292e-01, -2.21647e-01, 4.43334e-02, -1.40683e-02, 2.60483e-02, 3.63508e-01, 7.63434e-01, 4.11650e-03, 7.01619e-01, 2.19171e-02, -6.53879e-02, 4.26247e-02, 4.08451e-02, 5.30267e-01, 4.74611e-03, 7.13984e-01, 4.53722e-01, 9.31915e-03, 8.67342e-01, -2.55315e-01, -4.12149e-02, -2.05096e+00, 2.57743e-02, 2.58566e-01, 7.88918e-01, -2.71306e+00, -2.27744e-01, 2.79902e-01, -7.84762e-01, 4.28350e-01, -2.60469e-01, -8.61701e-01, 1.19680e-01], [-2.90431e-01, -3.79124e-02, -1.72454e-01, 5.68460e-03, -2.72364e-03, -9.79160e-02, 3.25745e-02, 5.44318e-02, 1.78834e-01, 1.67163e-01, 4.08816e-01, -1.71317e-02, -2.74915e-01, -8.37149e-03, 5.17831e-02, -4.87527e-02, 2.78798e-01, 6.03790e-02, 5.61342e-01, -1.44493e-02, 1.62407e-02, -2.55488e-02, -2.80897e-01, 4.50900e-02, 4.18272e-02, 5.86321e-01, -2.82103e-02, -4.12788e-01, -2.75103e-02, -4.82698e-02, 5.21242e-01, -3.93517e-02, -4.42667e-01, -1.22777e-01, 9.53804e-03, -2.23480e-01, 1.68447e-01, 3.64283e-02, 4.28270e-01, -1.86517e-02, 8.76876e-02, -8.42726e-01, 1.48710e-01, -8.32285e-02, -1.89739e-02, -5.22445e-02, 3.49330e-02, -3.60075e-02, 3.68273e-01, -1.36628e-02], [1.55947e+00, 1.70630e-02, 3.42684e-01, -1.63971e-02, 3.53026e-02, 4.33772e-03, 1.27079e-02, -3.18495e-01, -1.09996e-01, 4.40531e-02, 1.58795e+00, 2.18326e-01, -1.69328e-01, 7.67142e-03, -1.62380e-02, -9.79270e-01, -1.66926e+00, 4.48762e-01, 7.94626e-01, -1.85909e-02, 4.56803e-02, -3.71370e-02, 1.02350e+00, -1.19075e-01, 2.41864e-01, -7.72991e-01, 2.51357e-02, -4.30275e-01, 2.20131e-02, 2.59980e-02, 9.54648e-02, 5.13000e-02, 2.29415e-01, -4.12714e-01, 1.60299e-02, 1.54769e+00, 1.52389e+00, -1.90837e-02, -8.05792e-01, -1.46151e-02, 1.71413e-01, -7.40230e-01, -2.27348e+00, 8.13284e-01, -9.28595e-01, -2.46134e-01, 1.35797e+00, -1.29424e-01, 8.78007e-01, -8.55245e-01], [2.01741e-01, -3.88617e-02, 7.08568e-01, 3.39170e-02, 2.38771e-02, 1.53499e+00, -1.41664e-03, 4.18561e-01, -3.38167e-01, 6.69432e-01, -1.07403e+00, -3.94055e-01, -2.37960e-01, -3.41127e-02, -5.64283e-02, 2.18881e-01, -2.71860e+00, -2.76417e-01, 5.76472e-01, 3.98530e-02, -3.97306e-02, -2.29785e-02, 2.99968e-01, -3.65254e+00, 5.42269e-01, 2.85715e-01, -2.37082e-02, 3.44638e-01, 2.30748e-02, 2.38394e-02, -9.23638e-01, 8.65661e-03, -5.23406e-02, 8.35018e-01, -4.60758e-03, -2.39344e+00, -2.97386e-01, 3.31796e-02, -7.81799e-01, -1.92087e-02, 4.32850e-01, 1.72614e+00, -2.81548e+00, 6.31976e-01, -5.71662e-02, -8.50218e-01, 5.75726e-01, 1.64586e-01, -5.12563e-01, -8.73292e-03], [-1.23767e-01, -3.27054e-03, 3.96106e-01, 1.09924e-02, -2.26518e-02, -1.68066e-02, -2.66513e-02, -1.29517e-01, 7.12654e-01, -1.62315e-01, 1.59925e-01, -1.25945e+00, 4.52411e-02, -9.19400e-03, 1.45913e-03, 6.67509e-02, 4.11892e-01, 4.49272e-01, 1.78500e-01, 2.17160e-02, -3.06650e-02, -4.31109e-02, -1.77881e-01, -8.92655e-01, 1.53491e-02, -9.92793e-01, -5.00166e-02, 1.33788e-01, -9.33651e-03, 8.37614e-03, 1.36003e+00, 1.03323e-02, -5.73705e-01, 6.21321e-02, -1.65812e-02, 4.71772e-01, 1.76205e-01, 3.72536e-03, 1.67976e-01, -3.28961e-02, -1.55741e-01, 7.89930e-01, -1.87039e-01, -2.74471e-02, 1.01284e-01, 1.13993e-01, -4.31610e-01, -1.23108e-01, -1.42463e-01, 2.75834e-01], [-1.60771e+00, 2.45684e-02, -7.96652e-01, 8.47460e-03, 5.10570e-02, 5.97681e-02, 5.17387e-02, 7.12016e-01, 6.77313e-01, 1.05259e-01, 5.99094e-02, 4.18674e-01, 4.77447e-01, -4.13394e-02, 1.57042e-02, -3.75596e-01, -3.97470e-01, 1.22953e+00, 2.77365e-01, 8.04433e-03, 4.56632e-02, 5.39140e-03, 2.96922e-01, -4.34734e-01, -5.36733e-01, 5.29477e-01, -3.44990e-02, 3.41774e-01, 1.84389e-02, -3.48268e-02, 8.79097e-01, 5.44818e-02, -2.61918e-01, 3.21309e-01, 3.77771e-02, 4.92468e-01, 1.66010e-01, 1.95406e-02, 5.46996e-01, 3.21557e-02, 6.92002e-03, 1.13177e+00, 6.02914e-01, -6.85979e-01, 1.22105e-01, 1.24320e-01, -2.90050e-01, -3.75860e-01, 7.27257e-01, 3.49400e-01], [3.86967e-01, 3.44026e-02, 8.52942e-03, -2.83679e-02, 2.81990e-03, 3.74399e-01, 9.37211e-02, 8.21618e-01, -1.24217e+00, -2.37048e+00, -5.79103e-02, 1.57036e-02, -1.76784e-01, -3.21386e-02, -2.32660e-02, 3.54594e-01, 5.22901e-02, -8.54834e-01, 8.42655e-01, 2.91600e-02, 3.58532e-02, 4.32160e-03, 3.31607e-01, 6.15590e-02, -8.90826e-02, -3.21845e+00, -3.91895e-02, 9.04317e-02, -4.46945e-02, 3.98634e-02, 1.56946e+00, 5.07877e-02, 8.76236e-02, -1.68797e-01, 2.51872e-02, 3.38828e-02, -2.05249e-01, 4.77900e-02, 2.06303e-01, 1.86423e-02, -7.90475e-02, -1.35964e-01, -3.16320e-01, -5.28232e-01, -1.91535e-01, 1.13543e-02, 3.18549e-01, 7.48170e-02, 1.95120e-01, 1.30230e-02], [-7.75301e-01, -2.48083e-03, -1.53367e-01, 1.22035e-02, -1.49528e-02, -6.28427e-01, -1.85148e-02, 1.40060e+00, 1.24116e-02, -2.86434e-01, -5.55084e-01, -3.75248e-01, 7.19509e-01, 3.68509e-02, 4.96470e-02, -1.11942e+00, -1.87710e+00, -5.23607e-01, -3.30933e-01, -3.10144e-02, 4.49693e-02, -4.24520e-02, 9.20588e-01, -3.26784e-01, 6.63958e-01, -2.17441e+00, 1.06298e-02, -1.80197e-01, -4.49882e-03, 1.51304e-02, -1.11477e+00, 7.70181e-03, 3.02511e-01, -1.56036e+00, 3.75668e-02, -1.84750e+00, 2.15467e+00, -3.64376e-02, -1.74878e+00, 2.07437e-02, 1.60937e-02, -1.42550e+00, -1.37500e-01, 2.30134e-01, 1.12143e-01, 1.38729e-01, 1.93978e-01, 1.75004e-01, -2.52086e-01, -3.67760e+00], [-6.43884e-02, 4.20384e-02, -3.23540e-02, -2.29821e-02, 2.83487e-02, -2.17257e-02, -3.81143e-02, -5.82414e-03, -5.77325e-02, -4.64662e-02, -3.18511e-02, 1.64266e-02, 2.33510e-03, 3.97225e-02, 1.70644e-02, -8.91144e-03, -4.68143e-03, -6.34759e-02, 1.38123e-02, -4.25111e-02, -2.07827e-02, 6.43185e-03, -5.76617e-02, 9.61330e-03, -2.70095e-02, 4.52765e-02, -2.03308e-02, -2.66804e-02, 8.94339e-03, -1.47870e-02, -4.66328e-02, -8.20608e-03, -6.67943e-03, 3.39003e-03, -1.97144e-02, -2.90717e-02, -3.41197e-03, -1.78223e-02, 5.81717e-02, 4.62741e-02, -4.34361e-02, -5.02195e-02, -4.63340e-02, -2.85877e-02, 8.60756e-03, 1.45848e-02, -4.38928e-02, -4.12567e-02, 2.75895e-02, -3.46611e-02], [8.42225e-01, 3.02983e-02, 2.86852e-01, 1.04239e-02, -4.02689e-02, -4.62396e-01, 4.68197e-02, 4.93530e-01, -2.77045e-02, -1.39366e-01, 1.85184e-01, 9.17814e-01, 3.44555e-01, 2.83765e-02, 8.82612e-03, 9.90720e-03, 7.34783e-01, 3.12326e-01, 1.10605e-01, 2.82320e-02, -2.80105e-02, 1.36063e-02, -4.06726e-01, 9.02123e-01, -1.55312e+00, 2.72117e+00, -3.85382e-02, -5.25975e-01, 2.39709e-02, 3.96583e-02, 2.22187e+00, -3.39387e-02, 4.89327e-01, 1.11265e+00, 1.52305e-02, 1.56677e+00, 5.16195e-01, 3.73038e-02, 1.73281e+00, -1.97573e-02, 5.06204e-03, -3.06716e-02, 5.01335e-01, 5.23135e-02, 2.53619e-01, 8.01529e-02, 4.03588e-01, -6.92317e-02, 9.55383e-01, -1.26760e+00], [-1.12364e+00, 6.12686e-04, 2.23867e+00, 1.30466e-03, -1.78906e-02, -5.33583e-01, 9.34697e-03, -2.31643e-02, 1.40697e-01, -8.21988e-01, 5.74223e-01, 1.20635e+00, 5.54525e-01, 3.68980e-02, -1.12387e-02, 4.32856e-01, -3.94482e+00, 1.68804e+00, 1.38233e+00, 3.78075e-02, 2.51098e-02, 1.15965e-02, -1.30755e+00, 1.68789e+00, 3.89607e-01, 6.12336e-02, -6.86220e-03, 4.60795e-02, 2.55357e-02, 1.56081e-02, 5.30988e-02, 3.64950e-02, -1.86861e+00, -1.04837e+00, -4.34549e-02, 2.30649e+00, -3.86084e-01, 2.67068e-02, 1.05643e+00, -3.53379e-02, 4.18120e-01, -6.62333e-01, -2.49737e+00, 2.55220e+00, -9.85152e-01, -8.84526e-01, 1.45307e-01, 2.43935e+00, -1.29240e+00, 1.81915e-01], [3.38059e-01, 2.41704e-02, -5.72018e-01, 4.32219e-02, 3.62908e-02, 4.38421e-01, -9.40612e-03, -2.58283e-01, -6.73625e-01, -8.35765e-02, -8.52064e-02, -1.52821e-01, 2.92349e-01, -2.36863e-02, -4.57368e-02, -8.08800e-01, -1.32707e-01, -3.78997e-01, 2.45865e-01, -4.61055e-02, -3.56106e-02, 2.77200e-03, -1.22690e-01, -2.43866e-01, -1.57421e-01, 2.12659e-01, 1.85399e-02, -3.69150e-02, 3.78146e-02, -1.64368e-02, -4.39860e-01, 4.44368e-02, 4.78727e-01, -5.77550e-01, 8.12560e-03, 9.90943e-01, -4.28064e-01, -3.43226e-02, 5.75272e-02, -9.08229e-03, -1.62767e+00, 1.66994e-01, 6.25952e-01, -8.75321e-01, 2.03406e-01, -1.22980e-01, -4.25558e-01, 1.84032e-01, 1.31213e-01, -1.80996e-01], [1.96788e+00, 1.45716e-02, 1.25480e-01, 5.08213e-02, -6.67288e-03, -3.90720e-01, -5.64284e-02, 2.07073e+00, 4.47722e-01, 7.07274e-01, -3.67608e-01, 1.24680e+00, -3.31807e-01, -5.51495e-02, 8.63518e-03, 5.23989e-01, -2.00573e+00, 1.60000e+00, 3.90824e-01, -5.34416e-03, 1.37502e-02, 1.67746e-02, -7.23986e-02, -6.77308e-01, -9.58991e-01, 2.12459e+00, -7.76800e-03, 8.46935e-01, -5.06477e-02, 3.62322e-03, 8.30707e-01, -4.70890e-02, 6.34082e-01, -5.36607e-01, 1.00375e-02, -1.45116e-01, -6.21979e-01, 4.46425e-02, 5.26407e+00, 3.51891e-02, 1.23629e+00, -7.34597e-01, -8.17875e-01, 3.39304e-01, -9.68494e-01, -6.99914e-01, 6.02616e-01, 9.96868e-01, -3.97823e-01, 4.13798e-01], [7.66245e-02, -4.27133e-02, -7.19368e-01, -1.20176e-02, -1.16383e-03, -1.02190e+00, 1.26177e-02, 6.23226e-01, 4.06852e-01, 4.70082e-02, 7.20136e-01, 2.48623e-01, -5.93199e-03, 3.23068e-02, -5.08051e-02, 3.65795e-01, 2.97717e+00, -1.07250e+00, 1.00098e+00, 4.01112e-02, 1.37101e-02, -4.70717e-02, -8.05855e-01, -8.97227e-01, 4.00579e-01, 2.55234e+00, -1.70210e-02, -5.68336e-01, -4.04514e-02, -3.25853e-02, -1.63070e+00, 5.32867e-03, -3.41752e-01, -8.87660e-01, 1.42147e-03, 1.95814e+00, -6.81750e-01, -2.03181e-02, -4.62199e+00, -4.51177e-02, -2.00701e+00, 5.90459e-01, 4.60292e-01, 1.44965e-01, 2.18775e-01, 3.98361e-01, -3.31524e-01, -2.32641e-01, -1.13229e+00, 5.60481e-02], [-1.42603e-01, -4.39244e-02, 2.74916e-01, 4.49988e-02, -2.34718e-02, 1.07549e-01, -4.13813e-04, -2.81491e-01, -1.03716e-01, -6.13384e-01, -1.30518e+00, -4.02108e-01, 6.06708e-02, 3.26744e-02, 1.44604e-02, -1.21300e+00, 8.71112e-01, -2.79975e+00, 1.89442e-01, 8.93803e-03, -3.18394e-02, 2.07103e-02, 2.55347e-01, -2.24549e+00, 5.99616e-01, -1.37975e-01, 3.63136e-03, 3.65137e-01, 2.08819e-02, 1.49947e-02, -5.58895e-01, 2.68673e-02, -4.10930e-01, -2.16616e+00, -1.05801e-02, -1.62890e+00, 7.14215e-02, -4.46194e-02, -1.08302e+00, 3.77522e-02, 7.31204e-03, 1.40995e+00, 9.18534e-01, -1.82090e-01, 1.85807e-01, 9.73527e-02, 1.97403e-02, -8.30842e-02, 6.14702e-01, -7.44142e-02], [1.20540e-02, -4.77489e-02, -4.01525e-03, -2.92947e-02, -3.13451e-02, 1.00232e-02, -1.91051e-02, 1.84354e-02, 1.97859e-02, 5.25116e-03, -3.48163e-02, -1.67094e-02, -2.85181e-02, -4.03498e-02, -1.95420e-02, -1.63022e-02, -3.41286e-02, -5.24761e-02, -2.12120e-02, -2.86719e-02, 5.78376e-02, 2.05013e-02, -2.75800e-02, -2.39391e-02, 1.42808e-02, -1.75498e-02, 6.33438e-03, 3.36141e-03, -2.47920e-02, 2.01322e-02, -1.51660e-02, 2.08649e-02, -1.85605e-02, 1.90464e-02, 3.84813e-02, -1.95018e-02, -2.51826e-02, 1.35861e-04, -4.40289e-02, -3.44552e-02, 5.86940e-02, -1.02828e-02, -2.29982e-02, -9.12537e-05, -5.54883e-02, -5.69133e-02, -2.64582e-02, -4.10213e-02, -5.06703e-02, -7.11444e-04], [-1.04539e+00, -1.02298e-02, 2.39950e-01, -2.56760e-02, 4.25387e-02, -4.64789e-02, -1.69407e-02, 2.14007e+00, -2.47016e-01, -3.04104e-02, -1.50381e+00, 9.15252e-01, -1.49978e-01, 2.64203e-02, 2.64415e-02, 4.52798e-01, -2.39499e-01, 6.60948e-01, 5.40039e-01, 1.61193e-04, -2.63113e-02, 1.18478e-03, -6.52400e-01, 6.38726e-01, -1.43256e+00, -3.62527e+00, 9.67604e-03, 3.34621e-01, -3.45318e-02, -3.69474e-02, 8.98830e-01, 7.42270e-03, 7.82948e-02, 1.28273e+00, 1.79369e-02, 1.27665e+00, -3.61458e-01, -5.13064e-02, 5.50052e-01, -4.83203e-02, 6.15207e-01, 3.86059e-01, -3.84026e-02, 3.72325e-01, -5.31307e-02, -2.73854e-01, 2.57000e-01, 1.49970e-01, 9.13314e-01, 2.82826e-01], [-1.32683e+00, 3.89420e-02, 3.90534e-01, -3.61798e-02, 4.40374e-02, 3.12735e-01, -3.70497e-02, 7.22553e-01, 1.56582e+00, 1.24227e+00, 1.09839e+00, 9.87548e-03, -3.09377e-01, -2.36978e-02, -4.04090e-02, -4.88993e-01, 6.49829e-01, -1.69768e-01, -3.18522e+00, -3.09751e-02, -5.33664e-02, -4.49122e-02, 8.29918e-01, 1.06610e-01, -1.33497e+00, 2.36327e+00, 2.67738e-02, 1.84601e-01, 4.70515e-02, -2.49542e-02, -6.65667e-01, 4.10654e-02, -2.82811e-01, 1.30207e-01, 5.73636e-04, 5.98088e-01, -1.54201e-01, 1.55637e-02, 3.04738e-01, 2.94713e-02, -6.22143e-01, -1.82919e-01, -2.90088e-01, 1.02552e+00, 3.40674e-01, -1.87125e-01, 8.44368e-01, 7.43390e-01, 4.28136e-01, 3.15392e-01], [-1.09879e+00, 2.54298e-02, 1.75589e+00, -1.86899e-02, 1.35034e-02, -6.51463e-01, 1.96823e-02, -3.51786e+00, -5.01854e-01, 5.00723e-01, -7.12615e-01, -8.37642e-01, 3.41269e-01, -2.43933e-02, 2.74124e-02, 2.48336e-01, -1.55242e+00, 1.22666e+00, -3.77446e-01, -3.95207e-03, 3.39745e-02, 3.42132e-02, 9.61053e-02, 4.22197e-01, -3.83543e-01, 3.72721e-01, -2.36002e-02, 2.38993e-01, 2.60580e-03, 8.56836e-03, 1.21315e+00, 1.75118e-02, 1.42781e-01, 2.85712e-01, 1.69386e-02, 1.48553e-01, -1.88784e-02, 4.54235e-02, -3.35063e+00, 3.94170e-02, -6.52551e-02, 7.62660e-01, 7.72676e-01, 1.58704e-01, -2.32463e-01, 1.67852e-01, 8.10409e-02, -2.19669e-01, -1.05639e-01, 1.97377e-01], [-2.74963e-02, 4.00840e-02, 2.66197e-01, 5.43450e-02, 2.61703e-02, 1.01877e+00, -7.33973e-02, 4.44454e+00, -3.35629e-01, -8.56496e-01, -5.99838e-02, 2.81681e-01, 3.30216e-01, 3.13891e-02, 4.12822e-04, -3.39890e-01, -1.09036e-01, -2.65973e-01, 8.67716e-01, 3.29861e-02, -3.60682e-02, 2.31790e-02, -5.15798e-01, 7.02885e-01, 3.06586e+00, -2.39066e+00, 2.04856e-02, 5.07896e-02, 7.34385e-03, -2.05368e-02, 2.67321e-01, 3.02968e-02, -7.21800e-01, -1.35997e+00, -4.25091e-02, -3.35243e+00, 1.48790e+00, -3.85339e-02, 2.44532e+00, 2.02164e-02, -9.96011e-02, 1.23788e-01, -6.40544e-02, 8.97728e-01, 6.44875e-01, 1.99024e-01, 1.17818e+00, 1.62534e+00, 5.57314e-01, -2.18847e-01], [7.98027e-03, 2.24784e-02, 2.05960e-02, -1.34351e-02, -3.63830e-02, 8.10424e-04, -2.22437e-02, 3.50659e-03, -2.95462e-02, -5.97966e-02, -4.21144e-02, -2.37259e-02, 1.97218e-02, 6.39470e-03, -4.83438e-02, -4.20673e-02, 2.56040e-02, 2.58503e-02, -5.20152e-02, 4.70632e-02, 4.00095e-02, 5.76793e-03, -4.68581e-02, 1.12084e-02, 9.94137e-03, -1.91209e-03, -4.50767e-02, 4.65386e-02, 1.26483e-03, 1.76079e-02, 3.41313e-02, 3.07859e-02, -9.59539e-03, 8.90016e-03, 5.57271e-03, -1.91004e-03, -3.46620e-02, 1.11938e-02, 4.05381e-02, -3.00316e-02, -5.62829e-03, -1.03986e-02, -1.44105e-02, -3.12517e-02, 2.13830e-02, 1.69661e-02, -2.99792e-02, -5.54460e-02, 5.78790e-03, -2.99186e-02], [-8.59383e-01, -1.26657e-02, 4.32071e-01, 1.20954e-02, -2.83267e-02, 2.83244e-01, -4.03155e-02, 1.29819e-01, -3.07092e-01, 6.58546e-01, -4.05442e+00, 8.48029e-01, -5.04110e-01, 2.69941e-02, 2.60739e-02, -8.00833e-01, -2.41099e+00, 4.16068e-01, 1.09673e+00, 6.27211e-02, -3.04862e-02, 2.72485e-02, 7.92350e-01, -1.09515e+00, 5.42424e-02, 2.64781e-01, 1.31793e-02, -4.23396e-01, -3.53980e-02, -2.02485e-02, 2.68149e-01, 1.02010e-02, 9.90100e-01, -5.57516e-01, -3.59179e-02, 1.05769e+00, -3.69281e-04, 3.85642e-02, -3.60511e+00, -9.81441e-03, -1.49395e+00, -8.61919e-01, -3.78796e+00, 7.91061e-02, -2.70020e-01, 7.01333e-01, 9.60030e-01, 2.66298e-01, 8.21863e-01, -1.73134e-01], [-2.52266e-01, 1.93655e-02, 1.65649e+00, 6.06287e-02, -3.34444e-03, 1.13889e+00, 5.20750e-02, 7.55332e-01, -1.72433e+00, -2.32895e-01, -1.46056e+00, 7.35142e-01, 3.77419e-01, -6.80417e-03, -4.83524e-02, 1.63657e+00, -6.69131e-01, -6.26812e-01, -1.16856e-02, 5.08326e-03, -4.55248e-03, 1.41455e-02, -9.93170e-01, 1.41956e+00, -3.02915e-01, -1.34124e+00, 1.48295e-02, -1.12864e-02, 4.30482e-02, -1.07905e-03, -5.36015e-01, 1.60034e-02, 2.34644e+00, -1.52500e+00, 2.01780e-02, -2.50916e+00, -2.22950e-01, 2.26987e-02, 1.31120e+00, 3.82048e-02, 1.21937e+00, 4.03781e-01, 3.06578e-01, 1.88839e+00, 3.58584e-01, -3.91694e-01, 6.43112e-01, 3.38554e-01, -7.83244e-01, 3.75870e-01], [-1.48204e+00, 1.66987e-02, -1.92490e-01, 4.00202e-02, 5.02852e-03, 1.21252e-01, 9.00053e-03, -4.95670e-01, -1.64553e-01, 5.73833e-01, -4.32573e-01, -1.12507e-01, -2.18086e-01, 3.52893e-02, -1.96424e-03, 3.58248e-01, -1.00118e+00, -6.70276e-01, 2.29053e-01, 3.17365e-02, -4.11626e-03, -2.61178e-04, -5.01350e-01, 1.33824e-01, 3.33638e-01, -2.86340e+00, 1.07677e-02, 2.16658e-01, 3.79664e-02, 3.30295e-02, 9.86673e-01, -4.21521e-02, -3.85004e-02, 9.47425e-01, 3.62140e-02, 4.16073e-01, -1.08993e-01, 4.60593e-02, 5.07482e-01, -3.39160e-02, -2.66630e-01, 3.85894e-02, -8.19351e-01, 2.80704e-02, -7.35458e-02, -1.09395e-02, -3.33139e-01, -1.43167e+00, 6.99404e-01, 2.26225e-02], [3.55098e-01, -2.13228e-02, -4.30926e-01, -3.22730e-02, 1.04291e-02, 2.31440e-01, 2.62975e-02, 2.64316e-01, 1.98969e-01, 4.83143e-01, 2.25924e+00, 6.37702e-01, -1.70234e-01, -1.14361e-02, 1.23998e-02, 6.09008e-02, -1.39605e+00, -5.24170e-01, 2.21023e-01, 4.03858e-02, -4.27603e-02, 3.64521e-02, 3.15993e-01, 2.45219e-01, -4.90141e-01, 3.89144e+00, 1.77357e-02, 6.15052e-01, 6.49534e-03, 1.94913e-03, 2.46731e-01, -5.05924e-03, 3.22451e-01, 1.66017e+00, 4.33706e-02, -1.51673e+00, 5.34732e-02, 2.76700e-02, 1.13196e+00, 3.60471e-02, 1.11325e-01, 1.08895e+00, -1.09890e-01, 2.01284e-01, 3.10437e-01, -2.21275e-01, 8.83742e-01, -2.05177e-01, 1.20339e+00, -5.22396e-01], [1.26937e+00, 2.82129e-02, 2.24483e+00, 9.96278e-04, -3.96226e-02, -1.23634e+00, 1.36564e-02, 9.96795e-01, 3.34878e-01, 5.02039e-02, 5.69478e-01, 1.26364e+00, 1.90881e-01, -3.72433e-02, -2.97730e-02, 2.58593e-01, 4.59674e-01, -1.53199e+00, -8.49287e-02, 5.67551e-03, -9.07172e-03, -2.99410e-02, 4.10416e-01, 1.19794e+00, 7.26038e-01, 2.00193e+00, 2.72134e-02, 3.22930e-01, -1.78514e-02, 1.98094e-02, 2.71500e-01, -1.08811e-02, 1.65962e+00, 2.20968e+00, 4.90604e-02, -3.34020e+00, -3.88517e-01, 3.67274e-03, 4.74852e-01, -1.88523e-02, 9.86354e-01, -1.05613e+00, 2.40791e+00, 1.35527e+00, 1.43907e+00, 4.44743e-01, 1.86943e+00, -1.58357e-01, 3.62694e+00, 3.84268e-01], [-4.47261e-01, 3.65488e-02, 3.09642e-01, -3.53632e-02, 2.11393e-02, -3.82101e-02, 4.82316e-03, 2.11002e-01, 1.44237e-01, -5.33484e-01, 4.47821e-01, -3.61913e-01, 7.02600e-02, 2.58243e-02, -4.47906e-02, -1.55341e-01, 3.15061e-01, -7.55975e-01, 1.03001e-01, 1.33919e-02, 1.68670e-02, -5.97996e-03, 1.29237e-01, -2.62922e-01, -1.35969e-01, 6.90504e-01, -2.32518e-02, -6.83660e-02, 3.24541e-02, 4.97737e-04, 3.67909e-02, 7.61684e-03, -9.08238e-02, 3.25850e-01, -1.19725e-02, -8.99248e-01, 4.84753e-01, -8.23849e-03, -4.24034e-01, -9.67854e-03, -2.56852e-03, 2.92708e-02, -8.20145e-02, 2.41457e-01, -1.90323e-01, -3.42067e-02, 9.74530e-02, -8.92657e-02, 3.95930e-01, -3.75532e-02], [8.02936e-01, -4.97385e-02, 3.87842e-01, -1.61027e-02, 4.33459e-02, 3.24964e-01, -2.27125e-02, 2.54559e-01, 1.11485e+00, 7.38612e-02, 1.09228e+00, -5.09926e-01, -3.29902e-01, -9.96694e-03, -1.77214e-02, -2.40168e-01, -7.73616e-01, -1.07281e+00, 2.95949e-01, 3.41932e-02, -4.04289e-02, -3.69192e-02, 5.67632e-01, -2.61084e-01, 2.96318e-01, 8.89135e-01, 6.08619e-03, 2.24770e-01, 2.77393e-02, 4.53430e-03, 4.94206e-01, 3.30653e-02, 5.54390e-01, 4.30211e-01, 3.68028e-02, -2.17279e-01, 9.59296e-03, -1.89066e-02, 5.17622e-01, -1.26597e-02, -5.75675e-01, 1.70134e+00, -1.06490e+00, -7.99528e-02, -4.87314e-01, -5.44480e-01, 6.73634e-01, 1.91811e-01, 6.76615e-01, 7.48037e-02], [1.44750e+00, -1.28324e-02, 5.22113e-01, 5.17776e-05, 4.93227e-02, -4.28698e-01, 5.09542e-03, 8.05945e-01, 1.44920e-01, -5.45346e-01, 4.96483e-01, 1.65062e-01, 2.69346e-01, -3.56721e-02, 6.49101e-03, -5.95493e-02, 8.89588e-01, -1.02543e-01, 1.50972e-02, -1.19205e-02, 7.48174e-03, -4.29926e-02, 1.87568e-01, 1.58235e-01, -8.38184e-01, -3.65217e-01, 1.04636e-02, 2.61831e-01, -5.99430e-02, 1.05119e-02, 8.78597e-01, 4.06933e-02, 1.89535e-01, 7.10961e-03, -1.29670e-02, -6.89315e-01, 1.96896e-01, -3.44022e-02, -3.62002e-01, 9.50185e-03, -8.93508e-02, -5.09129e-01, -6.75504e-01, 2.29150e-01, -3.20711e-01, -1.70553e-01, 1.96775e-01, 5.58635e-02, 8.70257e-01, -1.57415e-01], [1.81331e+00, 3.89272e-03, -1.66372e-01, -2.04655e-02, -3.57240e-02, 1.44625e-01, -6.05570e-02, 4.58135e-01, -4.13933e-01, -8.56018e-02, -2.60763e-02, 1.87808e-01, -1.81826e-01, -4.62756e-02, 2.67946e-02, 5.18698e-02, 3.40461e-01, 2.77427e-02, -1.61920e-02, 4.53992e-02, 1.91689e-03, -1.66392e-02, -8.59235e-02, -4.45909e-01, -2.02874e-01, 1.79061e+00, -3.40507e-02, 2.15780e-01, -1.48441e-02, -1.95055e-02, -1.60490e+00, 2.96322e-02, -1.73121e-01, 2.66715e-01, -3.33093e-02, 1.32612e-01, 8.98504e-01, 2.70411e-02, -2.26607e+00, 3.68456e-02, 1.80712e-01, 1.11271e+00, 8.15214e-01, -3.38736e-01, 9.71253e-01, 3.52577e-01, -2.13574e-01, -1.31945e-01, -4.07345e-01, -3.30049e+00], [-1.59036e-01, -2.77358e-02, 6.66121e-01, 4.06231e-02, 4.17796e-02, 1.16817e-01, 1.64570e-02, 1.26330e+00, -8.39847e-01, 5.89606e-01, -1.87055e-01, 1.53183e+00, -5.44107e-01, 6.12443e-03, -2.24203e-02, 7.14167e-01, 9.61171e-01, 2.16685e-01, -6.65515e-01, -2.87002e-02, 1.15198e-02, -4.67119e-02, 6.00432e-01, 7.03677e-01, -4.88779e-01, 4.55794e-01, -4.15102e-02, 7.24735e-02, 4.00007e-02, -2.48588e-02, -3.91614e-03, 2.66289e-02, 5.23408e-01, -1.61752e+00, 4.27294e-02, 4.29581e-01, -3.12059e-02, -2.13305e-02, 4.68456e-01, 2.28420e-02, 1.33598e+00, -3.46411e-01, -2.81931e-01, 7.24471e-01, -5.25464e-03, 1.15908e-01, 3.11341e-01, 4.71293e-01, 1.19542e-02, 4.85715e-01], [-2.67952e-02, 3.76265e-02, -1.96881e-02, -3.66720e-02, -2.22114e-02, 2.40227e-02, -4.14115e-02, 1.51347e-02, -3.22124e-02, 2.24886e-02, -1.46787e-02, -5.82597e-03, -9.89616e-03, 2.77267e-02, 3.83216e-03, -4.03300e-02, -3.65338e-02, 1.63344e-02, 3.08484e-02, -1.72694e-02, -1.14017e-02, -5.28755e-03, -9.50432e-03, -8.42532e-03, -2.87924e-02, -3.99208e-02, -8.57988e-03, -4.34862e-02, -1.77970e-02, 2.67927e-02, 1.89850e-02, -4.59150e-02, -3.25865e-02, 1.48516e-02, -5.14883e-02, -2.77189e-02, -2.85727e-02, -5.04710e-02, -4.37170e-03, -1.09162e-02, -2.43239e-02, 3.46684e-02, -5.05976e-03, -1.12502e-02, -3.35001e-02, -3.38555e-02, 7.79659e-04, -5.44346e-02, 3.56798e-02, -3.86339e-02], [1.04747e+00, 2.73322e-04, 5.59064e-01, 3.52199e-02, 3.28747e-02, -3.09453e-01, 2.04232e-02, -1.07833e-01, 2.51563e-01, 2.66523e-01, -1.71293e-01, -1.65782e-01, 1.10781e-01, -6.02595e-03, -4.72785e-03, 4.28791e-01, -3.94520e-01, 1.12075e+00, 2.95972e-01, 3.31738e-02, -1.74885e-02, -1.32529e-02, 3.40867e-02, 4.69631e-01, 1.51649e-01, -4.13321e-01, -3.57887e-02, 1.30607e-01, -3.86920e-02, 3.10911e-02, 3.26641e-01, -7.29770e-03, 2.04116e-03, -3.24713e-01, 2.31715e-02, 2.96324e-01, -2.77288e-01, 2.81946e-02, 3.04494e-01, 8.60985e-03, 2.68411e-01, 6.86054e-01, 2.59147e-01, -1.61090e-01, -1.39377e+00, 1.36091e-01, -3.02459e-01, -3.53478e-01, 5.65551e-01, 8.48469e-02], [1.07961e+00, -3.25368e-02, 9.06536e-01, -1.08686e-02, -3.51639e-02, 1.20581e-01, 6.20970e-02, 1.46071e+00, -8.65315e-01, 8.76340e-02, -2.19249e+00, 4.93642e-01, 3.99590e-02, 4.14225e-03, 4.21259e-03, 1.84321e-01, -1.31084e+00, 5.77441e-01, 5.39583e-01, 1.01449e-02, 2.69755e-02, 9.45498e-03, 8.48601e-01, 6.14907e-02, -3.08075e-01, 3.94465e-01, -1.24293e-02, -2.55017e-01, -1.70189e-02, 4.51681e-02, 8.71497e-01, 2.23840e-02, 4.85294e-02, -9.90983e-01, 2.97796e-02, 8.17086e-01, -2.45605e-01, 1.94275e-02, -4.75215e+00, -4.45894e-02, -1.96657e-01, -2.91306e-01, 5.27806e-01, 1.73564e-01, 2.41040e-01, 1.18649e-01, 4.63416e-01, 1.41632e-01, 3.47045e-01, -4.53819e-01], [1.46734e+00, -9.78914e-03, -2.03599e-01, 1.93949e-02, -2.44747e-02, -2.77785e-01, 9.41424e-03, 3.47379e-01, -5.04117e-01, 7.36340e-01, -2.03829e+00, 3.80053e-02, -5.87207e-02, -5.16882e-03, -3.64506e-02, -6.19169e-01, 4.66871e-01, 1.53913e+00, 2.55177e-01, 3.93183e-02, -1.77028e-02, 2.15068e-02, -3.70927e-01, 5.37646e-01, 1.84497e-01, 1.46144e+00, 1.61741e-02, -1.94819e-01, 1.95406e-02, -2.78120e-02, 8.25562e-01, -3.20202e-03, -1.53921e-01, 2.09039e-01, -2.17657e-02, 1.88270e+00, 6.13360e-01, 2.44890e-02, -1.79944e+00, -4.78587e-02, -3.34207e-01, 5.07328e-02, 9.57265e-01, 2.95410e-01, -6.26597e-01, -2.96695e-01, 1.31342e+00, 6.13637e-02, 3.07254e+00, 5.44793e-02], [4.51535e-01, -2.23355e-02, 1.47728e-01, -1.14824e-02, -1.26942e-04, 5.30862e-01, -1.85028e-02, 1.30726e-01, -1.63427e+00, 2.57037e-01, -2.41573e-02, 4.39244e-02, -2.74937e-01, -8.28199e-03, 6.25227e-02, 5.28023e-01, -1.76663e-01, 3.59097e-01, 6.24369e-01, 4.88898e-02, -2.85654e-02, 2.30356e-02, 4.78942e-01, 5.37900e-02, 2.85797e-01, -2.53747e+00, 4.88113e-02, -5.08716e-01, 1.93391e-02, -1.64779e-02, -4.75189e-01, -3.83834e-02, -1.65976e-01, 1.05909e+00, 2.25234e-02, 4.31684e-01, 6.96078e-01, -2.81781e-02, -2.38824e+00, -1.82861e-02, 7.98577e-01, -2.45384e-01, -2.18087e+00, 5.68776e-01, 7.78185e-02, -2.52695e-01, -3.15237e-01, 2.61810e-01, -7.44510e-01, -2.01151e+00], [2.18265e-01, -1.13858e-03, 9.88714e-01, -1.20013e-03, -2.51332e-03, -1.89274e-01, 8.61636e-03, -1.28967e+00, -2.79475e-01, -2.89877e-01, 5.37043e-01, 1.11670e+00, -1.96211e-02, -2.05726e-02, -2.91058e-02, 1.26664e+00, 2.52804e-01, 1.01388e+00, 1.16812e+00, 3.67981e-02, 4.05366e-02, -4.01237e-02, -4.18797e-01, 1.38616e+00, -1.01455e+00, 9.71643e-01, -3.38598e-02, 4.21599e-01, 3.42334e-02, 4.14496e-02, 7.82409e-01, 3.43106e-02, -2.99260e-01, -1.97519e-01, -1.18690e-02, 1.36624e+00, 9.97969e-02, -1.14434e-02, 7.61652e-01, -3.69613e-02, -2.84499e-01, -1.65992e-01, 1.68660e+00, 6.38022e-01, 4.63510e-01, 3.31918e-01, 1.91179e-01, 2.55602e-01, 5.79998e-01, -1.47953e+00], [8.70085e-01, 2.14916e-02, 9.57511e-01, -8.81192e-04, 2.44412e-02, 2.47486e-01, 6.14661e-03, 3.76287e-01, -3.88248e-01, -1.69824e-01, 5.77919e-01, -1.36892e+00, 4.64574e-01, -6.30723e-03, 4.29903e-02, 4.29621e-01, -4.97541e-01, 5.52875e-01, 1.41206e+00, 1.45010e-02, -3.34011e-03, -4.93676e-02, -1.41428e-01, -3.50889e-01, -5.62214e-01, 1.02877e+00, 2.65291e-02, 3.34743e-01, -4.44388e-02, -1.31430e-02, -7.85927e-01, -3.37114e-02, 6.12183e-01, -1.83020e+00, 3.27279e-02, 2.85125e+00, -5.24925e-01, 2.46373e-03, 2.33770e+00, 1.76466e-02, 4.23623e-01, 1.51488e+00, -6.94046e+00, -2.31723e-01, -7.13457e-01, 6.31144e-02, 8.74858e-01, -1.66023e+00, 4.95946e-01, 6.52670e-01]] +[-1.89935e+00, 8.45820e-01, -1.02423e+00, 9.08320e-02, -1.51256e+00, -3.19686e+00, -2.97880e+00, 7.13797e-02, -3.11262e-02, -7.46238e-01, 1.48886e+00, 4.07391e-01, -5.51422e-01, 1.61221e-01, 2.29430e-01, -1.30712e+00, -2.39645e-01, -1.55359e+00, -4.56155e-01, -4.56285e-01, -4.88682e-02, -1.92987e+00, 1.09537e+00, 1.77154e-01, -2.11518e+00, -9.15449e-01, -1.56791e-01, -2.12380e-02, -1.10928e+00, -1.38609e+00, -1.42327e+00, -1.06354e+00, -2.39374e-02, 1.24494e+00, -2.69434e-02, -3.04116e-01, -1.57182e+00, -9.67988e-01, -3.20041e-01, -1.08016e+00, -1.61365e-01, -1.00397e+00, -7.73485e-01, -3.94404e-03, 7.28098e-01, -7.65786e-01, -6.60632e-01, -1.20816e+00, -1.77234e-01, -2.99020e+00, ] +ReLU +[[-6.50982e-01, -4.17225e-02, -6.80376e-01, 1.65056e+00, 6.98853e-01, 1.03281e+00, 1.68285e+00, -2.50067e-01, 3.43427e-02, 1.16256e+00, -1.28066e+00, 3.69328e-01, 2.17339e+00, 7.87768e-02, -7.98795e-02, 2.44805e+00, 1.05616e+00, -9.87851e-02, 5.07311e-01, -2.44629e-01, -1.18565e-02, 9.07297e-01, -1.62964e-01, 1.60297e+00, 1.79355e+00, 6.31182e-01, 4.33987e+00, -1.26680e-02, 3.77721e+00, 1.85578e+00, 1.13439e+00, -6.03476e-01, -2.21352e-02, 1.02368e-01, -3.46007e-01, 4.16624e-01, 8.61876e-01, -1.12341e-01, 2.86364e-01, 1.04578e+00, 2.52913e+00, 1.40868e-01, -5.44358e-01, 3.96355e-02, -6.60024e-02, 5.43510e-01, -1.80251e-01, 1.69863e+00, 9.73831e-01, 4.40895e+00], [-4.12443e+00, 2.55160e-01, 2.07694e+00, -1.72722e+00, 3.51302e-01, -1.95878e+00, -2.70042e-01, -1.42235e+00, -1.48396e-02, -3.22939e+00, -4.18277e-01, -2.80216e+00, -5.59016e-01, 1.15347e+00, 6.33382e-01, -2.57096e-01, -1.11824e+00, 5.20576e-01, 4.00579e-01, -3.52963e-01, 7.96850e-02, 5.97775e-01, -4.29721e-01, 1.36450e+00, 7.57154e-02, -1.00438e+00, -1.16601e-01, 4.12655e-03, -1.67817e+00, -9.31312e-02, 2.75437e+00, -1.52457e-01, 7.84464e-03, -7.07189e-01, -1.72345e-01, 6.57442e-01, -4.16391e-01, 2.32946e-01, -1.79613e+00, -1.40616e+00, -1.80802e+00, -5.82886e-02, -1.00139e-01, -2.78726e-02, 6.34892e-01, 5.88718e-01, 4.28103e-01, -1.81256e+00, -1.28491e+00, 3.56441e-01], [1.37089e+00, -1.19098e+00, -1.63017e+00, 5.30735e-01, 1.73317e-01, 4.67204e-01, 7.82737e-01, -1.13273e+00, 2.54184e-02, 4.85133e-02, 6.17050e-01, 4.41222e-01, 2.07312e+00, 8.97858e-02, 3.11153e-01, 7.16218e-01, 2.51169e-01, 7.89081e-01, 1.40139e+00, 2.46437e-01, 1.75983e-02, 3.87704e-01, -5.74615e-01, 2.56619e+00, -2.53712e-01, 7.13713e-01, 2.07937e-01, 1.34665e-02, 1.38385e-02, 3.11412e-01, 1.60439e+00, -1.62573e-02, 3.07991e-02, 2.66886e-01, -7.87811e-01, -3.45853e-01, 1.92652e-02, 1.35500e-01, 1.85607e+00, -6.76829e-01, 9.45555e-01, 1.78001e-01, -4.27064e-01, 1.92785e-02, 5.07329e-02, 3.35732e+00, 6.46457e-02, 6.14980e-01, 1.32864e-01, 3.67088e-01], [5.04845e+00, 7.57190e-02, -7.04700e-01, -1.02115e-01, -2.18314e-01, 3.42987e+00, 2.00558e+00, 2.40131e-01, -3.12282e-02, -1.93790e+00, -5.84638e-02, -5.03585e-01, 3.79080e+00, 6.53339e-01, 1.40306e-01, 1.42463e+00, 8.56130e-01, 1.34805e+00, 2.02725e+00, 6.09023e-01, -4.83092e-02, 8.03066e-01, 3.12514e-01, -9.96083e-01, -2.90459e-01, 1.08812e+00, 1.24875e+00, -1.65807e-02, 1.38469e+00, 1.13096e-01, 3.30098e+00, -5.67169e-01, 1.86813e-02, -4.48428e-01, -4.30038e-01, 6.87536e-01, 2.36730e+00, -5.46187e-01, -5.96850e-01, 7.25591e-01, 3.00476e-01, 4.28361e-01, -1.25025e+00, 2.43333e-02, 1.18255e+00, 2.99239e+00, 6.64390e-01, 1.59465e+00, -1.66173e-01, 8.24208e-01], [4.37632e+00, -6.48866e-01, -9.98573e-01, 1.72081e+00, -2.60984e+00, 2.66823e+00, -4.99114e-01, 2.31282e+00, 5.08448e-02, 1.14494e+00, 2.01552e+00, 2.23789e-01, 2.40791e+00, 4.25194e+00, 4.53089e-02, 1.18864e+00, 1.69648e-01, 9.26031e-01, 2.31789e+00, -5.62839e-02, 3.71566e-03, 8.92841e-01, -9.13057e-01, -1.99389e+00, 1.78747e+00, 1.53926e+00, 1.13920e+00, 5.92227e-03, 1.36407e+00, 1.29559e+00, 1.65450e+00, -4.17943e-01, -1.96260e-02, 4.63144e-01, 1.81442e-01, 2.33770e+00, 6.68541e-01, -5.06664e-01, 1.25568e+00, 2.36483e+00, 1.65578e+00, 9.96979e-01, -2.28373e+00, -3.98267e-02, -8.63087e-01, -5.49333e-01, 5.94921e-01, 1.23295e+00, -4.27660e-01, 2.10146e+00], [-2.41925e+00, -9.03920e-02, 1.24780e-01, -2.47867e-01, 4.76874e-01, -4.36002e-01, -1.11463e+00, -7.62905e-02, 3.80901e-02, 2.64363e-01, 1.04109e+00, -1.51497e+00, -7.77985e-01, -8.32460e-01, 8.84351e-01, -1.37417e+00, 1.88047e-01, -7.62268e-01, -9.63895e-01, -6.10558e-01, -1.26729e-02, -2.43809e+00, 1.50002e-01, -6.59479e-01, 2.69902e-02, -5.82447e-01, 1.60013e+00, 3.38691e-02, -1.06893e-01, -6.68958e-02, 2.27232e+00, -1.53560e-01, -5.04301e-02, -5.77745e-01, -6.99979e-03, -1.41286e+00, 8.92888e-01, 2.93908e-01, -4.71616e-01, -6.72678e-01, -2.44134e+00, -1.75042e+00, 1.13452e-01, 3.71840e-02, 1.24210e+00, -1.85136e+00, 3.14488e-01, -1.68891e+00, -6.74317e-01, -1.03214e+00], [4.34508e+00, 9.75116e-02, 4.12786e-02, -2.07212e-01, -1.93375e-01, -1.01857e+00, 2.69269e-01, -7.56508e-02, 6.45846e-02, -4.12003e-01, 3.26307e-01, 9.24865e-01, -1.21952e-01, 4.53485e-01, -1.10616e-01, 3.43627e-01, 2.29403e-02, 1.66073e-01, 7.41100e-01, -1.69800e-02, -4.99072e-02, 3.53186e-01, -3.13901e-01, -6.85089e-01, -2.27971e-01, 3.80436e-01, -1.05624e+00, 7.07850e-03, 3.73404e-01, 7.16393e-03, 1.72099e-01, -9.74963e-03, -4.43811e-02, -3.24125e-01, 2.63940e-01, 1.01846e+00, -2.20899e-01, -1.81334e-01, 4.13927e-01, 4.68321e-01, 1.04568e+00, 7.22846e-02, -3.07783e-01, 3.55248e-02, 7.41906e-02, 4.09496e-01, -4.76696e-01, 3.53214e-01, 1.12692e-01, -3.68244e-01], [-1.17915e+00, -5.91099e-01, 2.28744e-01, -4.07071e-01, 1.32432e-01, 1.98686e+00, -1.68576e-01, 3.01169e-01, 3.91662e-02, 2.95766e-01, 5.81955e-01, -2.39398e+00, 5.92252e-01, 2.89710e-01, -5.52779e-01, -9.85941e-01, -6.87184e-01, 6.30109e-01, 1.73868e+00, 8.76477e-02, 1.52197e-02, -1.78811e-01, -2.51583e-02, -1.24198e+00, 3.01822e-01, 8.01855e-01, 1.09582e+00, 4.02892e-02, -6.62665e-01, 2.17396e-02, 2.78187e-01, -4.00521e-03, -5.38557e-02, 1.49507e-01, -1.73316e-01, 8.74815e-01, 4.89877e-01, -1.51528e-01, -5.81511e-01, -1.80688e-01, -2.15911e-01, -2.23235e-01, 2.78232e-01, -4.82445e-02, -3.55905e-01, 2.28893e-01, -3.54494e-02, -2.08218e-01, 8.71067e-01, 3.37046e-01], [1.55060e+00, -1.56473e+00, 8.47676e-01, -9.70817e-01, -1.74768e+00, 4.85417e-01, -1.53563e+00, 1.39535e+00, -1.71853e-02, 7.97048e-01, 8.18112e-01, 2.13943e-01, 3.28984e-01, 1.33858e-01, -5.45677e-01, -6.00128e-01, 6.99291e-01, -4.62316e+00, -1.40981e+00, 2.58156e-01, -4.68441e-02, -2.72920e-01, 7.40447e-01, 5.05809e-01, 6.09586e-01, -7.28882e-01, 5.70803e-01, 2.55399e-02, -1.00559e-01, -1.53649e+00, -2.69492e+00, -5.30332e-01, 3.67815e-02, 9.22552e-01, -1.30985e-01, 2.08165e+00, -5.61621e-01, -5.37033e-01, 5.16341e-01, 1.60005e+00, 2.61682e-01, 9.70886e-01, -1.48294e-01, 3.03438e-02, -2.66491e-01, -1.13807e+00, 3.07322e-01, 7.34131e-01, -4.33907e-01, 9.49239e-01], [4.51572e-01, 1.02580e+00, 2.43708e+00, 8.04765e-01, 1.65182e+00, -2.50938e+00, 1.46897e+00, 4.72676e-02, -1.53098e-02, -1.62535e+00, -1.33361e+00, -1.89823e+00, -8.42423e-01, -4.76513e+00, -6.88314e-01, -2.82925e+00, -7.24846e+00, -3.86349e+00, -1.45621e+00, 6.76961e-01, -4.67416e-02, -1.86851e+00, -2.09846e+00, -2.05967e+00, -1.60165e+00, 6.57205e-01, -6.22135e+00, 2.35550e-02, -1.03423e+00, 1.62370e+00, 2.87990e+00, 9.27251e-01, -2.84805e-03, 7.03029e-02, 4.17833e-01, 2.46488e-02, -2.12157e+00, 1.29753e-01, -2.78565e+00, 9.85241e-01, -5.95860e+00, -1.18804e-01, 4.85735e-01, 3.24915e-02, -1.67037e+00, 1.27865e+00, -4.24137e+00, -1.08461e+00, 9.24234e-01, -2.16232e+00], [3.96774e-01, 3.81175e-01, -1.49917e-01, 1.54302e-01, -1.46935e+00, -4.14314e-01, -1.10106e+00, -1.03184e-01, -3.59315e-02, -2.89374e-01, -4.97308e-02, 4.92440e-01, 6.40065e-01, 5.76426e-01, 3.17806e-02, 1.25328e+00, -1.30209e+00, 1.19825e+00, 1.04346e-01, -4.30978e-01, -8.46755e-03, 5.60383e-01, 1.38920e-01, 5.34787e-01, -1.40185e+00, 7.84262e-03, 1.42958e+00, -1.75965e-02, -1.01007e+00, -8.13111e-02, -3.18766e+00, -1.09526e-01, 3.40625e-02, 7.53697e-01, 2.85525e-01, -1.45105e+00, -7.71348e-01, 8.20128e-02, 1.89571e+00, -8.82173e-01, -1.25973e+00, -1.58688e+00, -4.18197e-01, 4.68388e-02, 4.96747e-02, -3.57533e-01, -9.46461e-03, -2.78654e-01, 3.51659e-01, 4.13572e-01], [2.22184e+00, -6.33728e-02, -1.05395e+00, 2.87123e-01, 3.75541e-01, 9.88266e-01, 2.81953e-01, 2.47453e-01, 5.37694e-02, 1.74001e-01, 1.44245e+00, 7.75505e-01, 1.53048e+00, 1.49783e+00, -2.60308e-01, -7.86982e-01, 1.86981e+00, 3.05623e-01, 3.51883e+00, 8.08194e-01, 7.50331e-03, 1.24427e-01, -7.27093e-01, -2.52042e+00, 1.46330e+00, 2.50759e+00, 3.23552e-01, 9.61979e-03, 3.14608e+00, 9.29626e-02, 7.79431e-01, -4.11791e-01, -1.60007e-02, -5.98364e-01, -4.55751e-01, -2.84455e-01, 3.39477e-01, -5.67700e-01, 2.07047e+00, 1.83204e+00, 1.41952e+00, 9.94369e-01, -4.91726e-01, -1.16222e-02, 1.17605e+00, 2.10044e+00, 6.35298e-02, 1.26106e+00, 5.47858e-01, 6.45393e-01], [1.68519e+00, 4.37253e-01, 1.69942e+00, -2.50809e+00, -1.72176e+00, -4.57176e+00, 2.29667e+00, -2.06157e+00, 2.70495e-02, 4.46211e-01, -6.02937e-01, -1.53629e+00, -1.90443e+00, 1.35926e-01, -2.17628e+00, 8.44596e-02, -1.06331e+00, 4.88639e-01, -1.43638e+00, -1.09415e+00, -1.90159e-02, 2.45721e-02, 2.06489e+00, -5.92099e-01, -7.16979e-01, 1.82611e+00, 1.19180e+00, -2.79448e-02, -1.82785e+00, -1.21219e-01, 1.50073e+00, 3.21529e-01, 1.73010e-02, 1.60024e+00, -2.75012e-01, -4.62185e-01, -1.07823e+00, 8.38822e-01, -2.46365e+00, -1.51561e+00, -5.23336e-01, 1.05961e-01, 1.03139e+00, -3.15790e-02, -1.64023e+00, -1.55026e+00, 1.52018e+00, -3.07061e-01, -1.24989e+00, 6.60556e-01], [5.81388e-01, -5.56966e-01, -1.63126e+00, 7.80403e-01, 3.46490e-01, 6.65044e-01, -3.56155e-01, 1.52042e+00, 3.14123e-02, -6.46154e-01, 4.97406e-01, -3.79222e-01, 2.14640e+00, 1.02967e+00, 7.49790e-01, 7.18815e-01, 1.70962e+00, -7.38625e-02, 3.41809e-01, -3.50150e-01, 4.62775e-02, -2.29489e+00, -5.96593e-01, -1.83166e+00, 6.81035e-01, 1.19114e+00, -4.72405e-01, -3.91719e-02, -2.41634e+00, 7.73273e-01, -9.74237e-01, -3.42168e-01, 1.24690e-02, -3.60523e-01, -3.31061e-01, 2.15864e+00, 2.08755e+00, -4.77239e-01, 1.79941e+00, 2.63850e+00, 3.63341e-01, 2.53644e-01, 9.28135e-01, 1.35109e-02, 2.10056e+00, -9.74902e-01, 3.91727e-01, 2.39908e-01, -7.26131e-01, 8.68946e-02], [2.59065e-02, -2.30395e-02, -4.86511e-02, -1.49563e-02, -3.25140e-02, -4.34610e-02, -4.21068e-02, -3.69628e-02, -1.53959e-02, -4.30161e-02, -3.39548e-02, 4.65788e-02, -4.50510e-02, -2.75969e-02, -4.59276e-02, -2.07556e-02, 2.10294e-03, 2.35329e-02, 8.01963e-03, -1.51794e-02, 3.43921e-04, -2.41164e-02, -2.62574e-02, -4.37439e-03, 4.49733e-02, 3.83695e-02, 6.50983e-03, -2.79623e-02, -3.31953e-02, -1.45239e-03, 8.33265e-03, -5.07065e-02, 1.15486e-02, -2.08285e-02, 2.92320e-02, -2.49848e-02, -3.59345e-02, -5.65213e-02, -3.89667e-02, 1.91428e-02, -1.95249e-02, 1.66261e-02, 6.64622e-03, -8.56872e-03, -4.07573e-02, -3.82097e-02, 8.19976e-03, -5.43230e-02, 1.59370e-02, 3.79835e-02], [3.31312e-01, 2.43039e-01, -3.53606e-01, -2.69132e-01, -6.75385e-01, 1.09295e+00, 3.32875e-01, 4.26412e-01, -1.51788e-02, -1.30809e+00, 9.70987e-02, 6.23243e-01, 1.51722e+00, -1.06999e+00, 1.17986e+00, -1.83922e+00, 1.62794e+00, 7.43589e-01, -1.63715e+00, -2.99615e-01, 2.81223e-02, 1.11190e+00, 4.52446e-01, -7.56044e-01, -1.14795e+00, -8.74799e-01, -2.93096e+00, -8.38854e-03, 4.93935e-02, 7.53965e-01, -3.95415e-01, -1.83553e-01, 3.03549e-02, -1.70658e+00, -9.21634e-01, 5.44049e-01, 1.06028e+00, 5.17723e-01, -2.47532e-01, 6.67911e-01, 4.15768e-01, -1.78480e-01, -1.92179e+00, -4.06144e-02, 5.49612e-01, 1.38850e-01, 8.66908e-01, -7.15908e-01, -1.17477e+00, 1.37138e+00], [1.20975e-02, 1.21266e+00, 1.39899e+00, -2.56770e+00, 5.56591e-01, -3.26811e+00, 9.19848e-02, -1.10658e+00, 2.87558e-02, -2.03316e+00, -2.30316e+00, -5.35157e+00, -8.99337e-01, -2.67615e+00, -1.82024e+00, -2.46438e+00, 1.23800e+00, -1.08002e-01, -2.78323e+00, 8.29047e-01, -9.76141e-03, -1.51088e+00, -3.91037e+00, -7.56751e-01, -8.12734e-01, 3.60607e-01, -5.60833e+00, 3.59551e-02, -8.90168e-01, -4.19848e-01, -5.16802e+00, -1.37348e+00, -2.22492e-02, -1.74097e+00, 5.32237e-01, -4.77356e+00, -3.82924e+00, 2.52645e-01, -3.48381e+00, -4.34453e+00, -2.72946e+00, -1.18515e+00, 7.76308e-01, 3.43659e-02, -3.15990e+00, -1.18955e+00, -4.00547e+00, -7.33615e-01, -5.42100e-01, -2.60903e+00], [4.92424e-01, -4.87773e-01, -3.28121e-01, 1.47735e+00, -2.09416e+00, 1.29015e+00, 2.17416e+00, -1.23681e-01, -3.81468e-02, 1.61075e+00, -3.59702e-01, 1.81309e+00, 2.28210e+00, 2.57039e+00, 1.28582e-01, 2.49784e+00, -1.48952e-01, 4.10515e-01, 9.82515e-01, 5.17608e-02, -1.50419e-02, 3.58064e-01, -3.81653e-01, 1.03326e+00, 2.70526e+00, 1.29639e+00, 3.16443e+00, 1.82379e-02, 2.50463e+00, -8.97439e-01, 2.98250e+00, -3.56914e-01, -2.14390e-02, 3.27673e-01, -1.80815e-01, 2.77615e+00, 8.14767e-01, -4.47956e-01, 1.10258e+00, 5.64955e-01, 6.19638e-01, 2.16706e-01, -5.21682e-01, 1.17819e-02, -9.18393e-01, 2.05751e+00, 2.26040e-01, -7.66932e-02, -7.97131e-02, -4.00431e+00], [-4.28965e+00, -4.72671e-01, 1.17276e-01, -1.17205e+00, -4.07349e-01, 2.36172e+00, 6.17834e-01, -9.02080e-01, -1.63536e-02, -3.77427e-01, -1.78296e-01, 1.03602e+00, 5.25221e-01, 1.07509e+00, 1.87289e-01, -8.67168e-01, 6.76589e-01, -8.68711e-02, -7.47646e-01, -4.50549e-01, 1.00498e-03, 1.53451e+00, -3.53067e-01, 1.48270e+00, -2.18340e-01, 2.23306e-02, 1.60042e+00, -2.37797e-02, -1.33730e+00, 1.02548e+00, -1.15751e+00, 1.51975e-01, 4.49266e-02, 3.13518e-01, 1.89433e-01, 1.75115e+00, 6.05481e-01, -4.41271e-01, 2.06149e+00, -3.13905e-01, 6.00540e-02, 1.90103e-01, -5.70068e-01, -2.67950e-02, 2.34378e-01, 1.41060e+00, -3.03915e-01, 8.85083e-02, -2.33704e-01, 3.11752e-01], [3.14058e-01, -8.34449e-02, -7.04626e-02, 8.30612e-02, -4.02756e-01, -5.66057e-01, 2.07300e-01, 3.41248e-02, 2.42819e-02, -4.15813e-01, 4.29061e-01, 3.13778e-01, -2.26644e-01, -6.06492e-01, -2.55394e-02, -2.07448e-01, -5.53199e-01, 9.89128e-02, 7.72895e-01, -8.61113e-02, -4.28852e-02, -6.82719e-01, -1.43760e-02, -5.04996e-01, -4.40588e-01, -7.57660e-01, -4.03995e-01, 2.68880e-02, 8.82352e-01, 3.41394e-01, -5.34785e-01, 5.68106e-02, 3.61896e-02, -1.88935e-01, -1.00557e-01, 3.88525e-01, -8.15569e-02, 2.32241e-01, 3.28640e-01, -8.49919e-01, -4.16114e-01, 7.45622e-02, -3.53406e-02, 1.56516e-02, -1.55985e-01, -5.82895e-01, 3.91505e-02, -3.26101e-01, 1.53942e-01, -1.40475e+00], [4.54969e+00, 2.01401e+00, 1.37117e+00, -1.09862e+00, -1.10061e+00, -2.49593e+00, -2.71231e+00, -1.76158e+00, 3.23478e-02, -1.26605e+00, -1.69053e+00, 8.80730e-01, -2.21655e+00, -6.84421e-01, -6.11366e-01, -5.41051e-01, -1.31135e+00, -2.03121e+00, -1.78377e+00, -1.71362e+00, -4.92552e-02, -1.04528e+00, 2.35254e+00, -2.56426e-01, -9.08061e-01, 6.75770e-01, -2.98750e+00, -4.25384e-02, 1.05458e+00, -2.18499e+00, -4.73718e+00, 4.90036e-01, 2.05963e-02, -3.97054e-01, 9.47106e-02, 3.40095e-02, -1.50124e+00, 1.33165e+00, -2.57940e+00, -2.58948e-01, -1.51108e+00, -3.81373e+00, -2.02830e-01, 2.60196e-02, -2.22296e+00, 1.11396e+00, -8.20131e-01, -3.54510e+00, 1.12522e-01, -1.24977e+00], [1.43235e+00, -2.95686e-01, -7.80604e-01, 1.07699e+00, 1.01627e+00, 1.78027e+00, 9.96023e-02, 4.01166e-01, -1.50846e-02, -1.04968e+00, 6.13396e-02, -1.67561e+00, 9.22868e-01, 3.42679e+00, 6.15896e-01, 1.59796e+00, 3.49649e-02, 2.35695e+00, -4.97469e-01, -7.17339e-01, -1.09022e-02, 3.63229e-01, -1.28382e-01, 7.62914e-01, 9.38287e-02, 4.07097e-01, -2.93488e+00, 3.61170e-03, 2.14505e-01, 8.15088e-02, -6.61095e-01, -1.34922e-01, -2.91238e-02, -1.84782e-02, 5.71982e-01, 2.92917e+00, 1.17353e+00, -4.83784e-01, -4.07914e-01, 2.58536e+00, 1.76346e-01, -3.09444e-01, 5.82413e-02, -4.55222e-02, -2.18437e-01, -3.74244e-01, 2.15300e-01, 1.96790e-02, -4.24118e-01, -1.26704e+00], [9.59777e-01, 1.52559e-01, 1.99542e+00, -6.28252e-01, -1.30421e+00, -2.61725e+00, -1.40416e+00, -3.85148e-01, 8.42408e-03, -7.25169e-01, -3.18214e+00, 5.67942e-03, -2.90586e+00, -2.33088e+00, -3.83875e-01, 1.88088e-01, -2.50058e-01, -3.01371e+00, 1.03389e+00, 1.10378e+00, -2.54444e-03, 1.62498e+00, 2.20323e-01, 2.91611e-01, -7.97127e-01, 4.47807e-02, -1.61021e+00, 1.82755e-02, -1.38595e+00, -7.39267e-01, -9.14930e-01, 5.50243e-01, -2.00765e-02, -2.94458e-01, 2.76871e-01, -2.29061e+00, -1.40695e+00, 7.31549e-02, -1.97295e+00, -3.92227e-01, -1.63966e+00, 3.81400e-01, 9.09157e-01, -1.56322e-02, -1.89699e+00, 1.14679e+00, -1.10166e+00, 9.57816e-01, 7.76990e-01, -2.52295e+00], [8.29042e-01, 3.79585e-01, -7.24484e-01, 8.14752e-01, -1.56380e+00, -5.43371e-01, -5.77991e-01, 1.71202e-03, 4.52068e-03, 2.40093e-02, 3.74647e-01, 3.57674e-01, 8.74342e-01, 2.61567e+00, -1.97697e-01, 9.19097e-02, 1.20093e-01, 1.14036e+00, -4.21852e-01, -1.80212e-01, -7.83708e-03, -4.56159e-01, -1.62807e+00, -2.56166e-02, -8.50397e-01, -4.77361e-01, -2.10153e-02, 2.78367e-05, -5.40182e-01, -5.74000e-01, -3.47556e+00, -2.56899e-01, 3.49240e-02, -3.56299e-02, -4.70742e-02, 1.15447e+00, -1.61509e-02, 1.21391e-01, -7.46144e-01, 2.55390e-01, 8.77005e-03, -1.21670e+00, 3.76516e-01, 2.12212e-02, -1.10371e+00, -7.10868e-01, 2.85931e-02, 1.40636e-01, 3.57957e-01, -9.05169e-01], [-4.89082e-01, 4.26296e-01, 8.90777e-01, 2.48219e-01, -3.36836e+00, 6.48644e-01, -2.30984e+00, 8.77114e-01, -2.84742e-03, -1.48682e+00, 1.16331e+00, -5.55462e-01, -2.35124e+00, -1.38974e+00, 7.60256e-01, -1.35528e+00, -3.51663e-02, -1.62555e-01, -2.06319e+00, 2.99115e+00, 3.24018e-02, 1.47417e+00, 7.43436e-01, -2.01479e+00, -9.88219e-01, -8.57521e-01, -7.96589e-01, 8.94748e-03, -2.83573e+00, -6.96326e-01, -1.57841e+00, -2.58342e-01, 3.40730e-02, -7.68232e-01, 1.57389e-01, 1.64985e+00, -2.72654e-01, 1.30897e-01, -6.00765e-01, 1.39670e+00, -4.39276e-01, 1.70527e+00, -9.89717e-01, 3.53825e-02, -8.41100e-01, 1.63114e+00, 2.73441e-01, 1.67792e+00, 1.47886e+00, 1.39246e+00], [1.73505e+00, -3.48609e-01, -1.60602e+00, 2.14376e-01, -1.22715e-01, 1.00945e+00, -7.98602e-01, 1.52012e+00, 3.87599e-04, -4.06126e-01, 1.57424e+00, 2.43990e-01, 2.78396e+00, 1.44092e+00, 6.85587e-01, -9.09455e-01, 5.20541e-02, 1.04556e+00, 2.84156e-01, -3.60626e-01, -3.55116e-02, 1.13073e-01, -6.14425e-01, -1.33903e+00, 1.24065e+00, 8.90717e-01, 2.85815e-01, -2.05333e-02, -1.05387e+00, -1.55845e-01, 1.21559e+00, -2.05489e-01, 1.92788e-02, -2.04992e-02, -2.80346e-01, 7.65555e-01, 8.22730e-01, -2.78377e-01, 2.24301e+00, 8.44744e-01, 5.15239e-01, 1.37565e+00, -9.58127e-01, -1.95562e-02, 8.75230e-01, 3.40782e-01, 1.29496e-01, 1.18548e+00, -4.83103e-01, -8.56226e-01], [6.45933e-01, 1.39278e-01, -1.70117e-01, -6.50513e-01, -1.95975e-02, 1.00079e+00, 4.23562e-01, -7.51630e-01, 2.30494e-02, 2.49820e-01, 3.48665e-01, 6.21846e-01, -9.64988e-01, -1.67644e-01, 2.66331e-01, -4.71787e-01, -1.99407e-01, -4.81761e-01, -1.03513e+00, -4.73424e-01, 1.85984e-02, 7.78051e-01, 7.88157e-02, 6.52116e-01, 1.05690e-01, -7.54371e-01, 5.55977e-01, 1.14747e-02, -6.50248e-01, -6.32389e-02, 1.09919e+00, -3.06872e-02, -4.90372e-02, 4.36967e-01, 1.92913e-02, -5.74633e-01, -7.62691e-02, 1.33556e-02, -2.16339e+00, 4.39137e-01, 4.24356e-01, -3.51662e-01, -4.22870e-01, 5.44387e-03, -2.43762e-02, 3.24564e-01, -3.94314e-01, 6.90589e-01, 8.85187e-02, 5.64619e-01], [-7.01907e-01, 5.78457e-02, 9.93501e-03, 1.15696e-03, 4.09172e-02, -3.91394e-01, -1.90542e+00, 1.17161e-01, -3.12686e-02, -5.58149e-01, 2.06139e-01, 2.40342e+00, -4.59855e-01, -1.55069e+00, 3.83659e-02, -1.28581e-01, -3.77355e-01, 2.72837e-01, -1.66617e+00, 5.87403e-01, -3.75180e-02, -4.49283e-01, -1.10895e-01, -8.06718e-01, 2.83086e-01, -6.29939e-01, -1.30148e+00, 2.65276e-02, -1.08382e+00, -1.51657e+00, 1.50834e+00, 3.64574e-01, 1.62761e-02, -2.82947e-01, -9.43444e-02, 8.67865e-02, -1.12296e+00, 3.52887e-01, -3.41070e-01, -1.40290e+00, -7.82014e-01, 3.55005e-01, -3.01113e-02, -2.06880e-03, -4.72401e-01, -8.80485e-01, 1.02889e-01, 4.52615e-01, -5.81088e-01, 6.91690e-01], [2.62096e-01, -5.91014e-02, 7.39360e-01, 1.75863e-01, -1.44662e-01, -1.88915e+00, -8.82740e-01, -7.14303e-01, -1.77344e-02, -1.04977e+00, -1.61380e+00, 1.24997e-01, -2.82980e-01, -4.50081e+00, 1.39777e-01, -5.38612e-01, 2.04287e-01, -9.19895e-01, 7.86407e-01, 1.39961e-01, 2.22798e-02, -9.55804e-01, -2.21928e-01, 4.74039e-01, 2.82838e-01, -5.38744e-01, 2.16489e-01, 2.76801e-03, -1.00923e-01, -6.68210e-01, 1.07417e+00, 4.41582e-01, -2.13867e-02, -5.11617e-01, 2.87403e-01, 1.59155e+00, -1.26510e+00, -1.19979e-01, -2.27454e+00, -2.42796e-01, -2.79089e+00, 4.78603e-02, -6.73489e-02, -3.27944e-02, -3.76658e-01, -8.63963e-01, 3.61622e-02, -2.64474e-01, 2.27728e-01, -1.28818e+00], [1.67589e+00, -3.65060e-01, -1.32043e+00, 1.83980e-01, -3.35636e+00, 6.70822e-01, -3.09694e+00, 1.13754e+00, 3.80447e-02, 2.39696e-01, 7.28332e-01, -4.39208e-01, 1.04999e+00, -1.85203e-01, 6.20269e-01, 1.87985e+00, 9.87808e-01, -6.74608e-03, -9.23166e-01, -3.34816e-01, 4.36158e-03, 1.40250e+00, -9.45032e-01, -4.31658e-01, 8.98465e-01, 2.42714e-01, 4.94391e-02, -7.63319e-04, -7.91588e-01, -7.94643e-01, 2.15684e+00, -8.09711e-02, 3.57534e-02, -3.49604e-01, -6.98866e-01, -2.35120e-01, 8.52122e-01, -2.27564e-01, 2.49889e-01, 3.90426e-01, 4.76736e-01, 2.61387e-02, -7.72977e-01, 1.61628e-02, 3.43565e-01, 2.63678e+00, -9.83947e-02, 1.20420e+00, 4.99960e-01, 1.13504e+00], [2.87998e+00, 2.05552e-01, 8.50785e-01, 7.47997e-01, -1.13884e-01, 1.07411e+00, -2.72932e-01, 1.56885e+00, -9.00406e-03, -1.66053e+00, -1.36840e+00, 1.31611e+00, -8.73880e-01, -2.49096e+00, -3.31247e-02, 8.68586e-01, 7.76436e-01, -5.21052e-01, -1.12678e+00, 6.94155e-01, 1.45741e-02, -1.47970e+00, 3.45470e-01, -1.22772e+00, -7.18590e-01, -9.61831e-01, -6.96253e-01, -4.81155e-02, -6.13386e-01, -2.24630e+00, -7.69472e-01, 1.44836e-02, 2.15166e-02, -8.81891e-02, 7.33249e-01, -4.28831e-02, -1.05834e+00, -4.89082e-01, -4.31962e-01, 1.28188e-01, -1.13293e+00, -1.96052e+00, 5.65837e-01, 1.19510e-03, -9.85267e-01, -2.00553e-01, -6.93443e-01, -9.87744e-01, 5.17415e-01, -1.24598e+00], [1.17027e+00, 1.94100e-01, -5.09761e-01, -3.19743e-01, -3.59536e-02, -1.16870e-01, 9.45612e-02, 1.42238e-03, 1.90693e-02, 3.51143e-01, -4.07384e-02, 2.73219e-01, -3.98614e-02, -1.70648e-01, -3.86843e-02, -3.88303e-02, -2.48617e-01, 2.50072e-01, -2.62730e-01, 6.35715e-02, 4.70735e-02, 1.64777e-01, 1.35041e-01, 4.29203e-01, 7.90214e-01, -5.01455e-01, 7.85513e-01, -1.48428e-02, 7.22880e-01, -2.32712e-01, -8.29601e-01, -1.51642e-01, 3.52535e-02, -3.19652e-01, 1.04401e-01, -3.53510e-01, 5.96647e-01, -8.91423e-02, 3.68719e-01, -3.07521e-01, -2.33781e-01, -2.88093e-01, 6.26033e-02, -2.25053e-02, -9.54758e-02, 2.19239e-01, 1.91885e-01, -4.54318e-01, -5.64385e-02, 2.18175e-01], [-2.06726e-02, 2.93702e-02, -5.03752e-02, -3.54369e-02, 2.19901e-02, -4.05643e-02, -4.66470e-02, 9.88613e-03, 1.29730e-02, -8.61629e-03, 9.64421e-04, -1.08142e-02, -6.89476e-03, -5.77764e-02, -3.14397e-02, 2.88739e-02, 2.09131e-02, 3.40636e-04, 1.81234e-02, 3.92582e-03, 6.77784e-03, -2.51455e-02, 8.55998e-03, -4.46441e-02, 1.21847e-02, -2.82802e-02, -1.40866e-02, 2.13079e-02, 4.80294e-03, -5.24776e-02, -1.12994e-02, -4.02220e-02, -5.44600e-02, 1.41987e-02, -1.17863e-02, 4.73275e-04, -5.82427e-02, -1.92120e-02, 1.15738e-02, 2.45868e-02, 1.92573e-04, -6.76340e-04, -4.12617e-02, -4.13387e-02, -4.84379e-02, 1.77350e-02, -1.33843e-02, -1.24929e-02, 4.19073e-02, 2.76447e-02], [2.24444e+00, -3.35882e-01, -7.36264e-01, -2.32376e-01, 4.70901e-01, 1.34997e+00, 1.94023e-01, 9.19407e-03, 3.35923e-02, 8.64666e-01, -7.66082e-01, -1.48933e-01, 2.09625e+00, 5.85170e-01, 5.14059e-01, 2.93921e-01, 6.17180e-01, -1.03826e-01, -2.19483e+00, 4.52143e-02, 6.91493e-03, 1.01247e+00, -8.35543e-03, 1.24686e+00, -2.91784e-01, 8.10092e-01, 9.06209e-01, 7.76754e-03, -1.23915e-01, 1.87300e-01, -4.01453e-01, 5.24869e-02, 2.91716e-02, -1.53351e-01, 4.11659e-02, 7.55266e-01, 1.08302e+00, -2.74200e-01, 1.23001e-01, -1.42317e-01, 2.21065e-01, 8.02417e-01, -2.32938e-01, 4.10267e-02, 2.52266e-01, 1.94669e-01, 2.71508e-01, -6.53145e-01, 3.22533e-01, 8.11994e-01], [-2.79157e+00, 1.61589e+00, 1.09199e+00, -7.45765e-01, 1.66165e-01, -3.70178e+00, -4.76194e-01, -9.66228e-01, -2.94249e-02, -9.03767e-01, -1.44292e+00, -4.98957e-01, -5.04432e+00, -2.46663e+00, 7.62096e-01, -1.50479e+00, -4.33010e-01, -3.13472e-02, -1.03564e+00, 8.75501e-01, -7.62649e-03, 5.32054e-01, 1.54537e+00, 2.89245e-01, -1.62477e+00, -3.04848e-01, -3.38311e+00, 3.23388e-02, -5.85163e-01, -2.59269e-01, 4.87840e-01, 1.82640e-01, -2.12124e-02, -1.40414e-01, 1.56375e+00, -2.30971e+00, -2.12171e+00, 5.57381e-01, -3.28300e+00, -1.15135e+00, -1.39453e+00, -1.46169e+00, -8.59824e-02, 4.40196e-03, -2.04163e+00, 2.11696e-02, -4.36050e-01, -1.03634e+00, 5.34743e-01, -3.20762e+00], [3.33345e+00, -4.59158e-01, -7.55255e-01, 6.31827e-01, -7.31001e-01, 2.09313e+00, 2.82656e-01, 1.42100e+00, -2.51330e-02, 1.33416e+00, 2.13801e-01, 3.95591e-01, 2.18985e+00, 5.51708e-01, -6.15222e-01, 2.42924e-01, 8.50983e-01, 1.26276e+00, 9.06017e-01, -1.57711e-01, -1.35358e-02, 1.42542e+00, -1.48760e+00, 1.36171e+00, 2.60651e+00, 2.98997e-01, 6.00046e-01, 2.61440e-02, -8.40849e-01, -5.82002e-01, 1.28799e+00, -1.23604e-01, 4.10615e-02, -3.68740e-01, 1.62016e-01, -2.24838e-01, 7.05696e-01, -3.31611e-02, 9.38384e-01, 8.59202e-01, -1.17457e+00, 3.15625e-01, -3.74041e-01, -2.41322e-02, 1.11656e+00, 2.68692e+00, -1.72133e+00, -2.92591e-01, 2.22578e-02, 9.59642e-01], [2.26447e+00, -2.75377e-01, -1.01688e+00, 1.23326e+00, 5.39571e-01, 2.40719e+00, 3.77642e-01, 5.57805e-01, -2.17274e-02, 1.95821e+00, 9.76827e-01, 1.27110e+00, 4.27092e+00, -2.91696e+00, -1.46083e+00, 1.58684e+00, 3.80497e-01, 1.91268e-01, 1.28622e+00, -3.30604e-01, 1.08448e-02, 1.32045e+00, 2.17524e-01, -1.18269e+00, 4.10847e-01, -7.30858e-01, 3.24621e+00, 2.73715e-03, -2.24577e-01, -7.12889e-01, 2.61347e+00, -6.29372e-01, 3.01085e-03, 1.61131e-01, -2.13614e-01, 3.23028e+00, 7.04927e-01, -4.60893e-01, 1.51311e+00, 1.10354e+00, -7.29219e-02, 4.62551e-01, -7.88238e-02, 4.83286e-02, 1.66247e+00, 2.37665e+00, 5.33536e-01, 1.82695e+00, -1.48337e-01, 1.51649e+00], [5.96225e-01, -7.69085e-01, -5.49906e-01, 5.12905e-02, -1.04455e+00, 2.21469e+00, 6.20048e-01, -5.40988e-01, 2.74646e-02, 3.14281e-01, 6.28839e-01, 9.69296e-01, 1.07667e+00, 1.01797e+00, -5.19717e-01, -1.21476e-01, 6.59905e-01, -6.91748e-02, 1.39316e+00, -6.68987e-02, -1.73978e-02, 1.18277e+00, -1.78645e-01, 1.59639e+00, -8.44474e-02, 5.46507e-01, 7.23976e-01, 4.82456e-02, -5.14978e-02, -5.27835e-03, -5.88090e-01, -7.97712e-02, -2.17623e-03, 4.61753e-01, 8.18362e-02, 1.85516e+00, -2.24106e-01, -2.23194e-01, 1.13671e-01, 1.00824e+00, -2.54330e-01, 1.09591e+00, -5.83732e-02, 3.48259e-02, -1.05436e+00, 1.74575e+00, 1.92003e-02, -6.71938e-01, 4.52413e-01, 5.75155e-01], [7.91254e-01, -1.67012e-01, -9.87316e-01, -6.85617e-02, 4.31895e-01, -2.83585e-01, -2.70722e-01, 1.92924e+00, 4.86261e-03, 4.33428e-01, 5.65668e-01, 7.80259e-01, 5.09315e-01, 1.51068e+00, -7.47352e-01, 4.99507e-01, 2.06882e-01, 1.25100e+00, 3.81410e-01, -4.13109e-01, 3.87770e-02, 2.13123e-01, -1.44893e-01, -2.42972e+00, 7.24033e-01, -7.40748e-01, 1.47710e+00, 3.07341e-02, 9.81876e-01, -2.41164e-01, -1.01874e+00, -3.58886e-02, 2.83336e-03, 6.29715e-01, 2.20470e-02, 1.89797e+00, 6.58152e-01, -2.68293e-01, -1.08318e-01, 2.87883e-01, 1.31169e+00, 6.12306e-01, -2.64954e-01, 3.60845e-02, -2.44959e-01, 2.40216e+00, -2.84519e-01, 9.85414e-01, 3.30076e-01, -6.53789e-01], [7.27731e+00, 3.59723e-01, -2.71009e+00, 1.45618e+00, -7.54094e-01, 4.35641e+00, 1.57143e+00, -8.25674e-03, -5.43237e-03, 2.18328e+00, 2.66680e-01, -2.07040e-01, 9.19605e-01, 1.99073e-01, 8.70806e-01, 4.32480e-01, 3.02403e-02, 2.12597e+00, 1.62822e+00, 1.47875e-01, -4.30763e-02, 3.25229e-02, -3.95191e-01, 6.12889e-01, 1.74911e+00, -1.15317e-02, 2.08130e+00, 1.74154e-02, 5.03989e+00, 1.68676e+00, -2.23712e-01, -1.08912e+00, 6.07078e-04, 9.30758e-01, -7.98298e-01, -1.61601e+00, 1.69232e+00, -1.02075e+00, -5.92003e-01, 1.58192e+00, 2.71537e+00, -2.41976e-01, 9.16027e-02, 2.95204e-02, 1.03833e+00, 1.81158e+00, 1.19309e+00, 1.46768e+00, 5.84891e-01, 3.53873e+00], [1.70015e+00, -1.24902e-01, 2.00288e-01, 1.52672e-01, 9.13584e-01, 3.40325e-01, -3.71154e-01, 2.05291e+00, 4.46866e-02, 7.55161e-01, 1.57976e-01, 5.70265e-01, 9.69029e-01, -1.64877e+00, 1.80264e-01, 8.55207e-01, -4.68806e-01, -4.67350e-01, 2.04210e+00, 5.56397e-01, 1.21746e-02, 3.85030e-01, 4.50884e-01, 1.51852e+00, -2.67387e+00, 1.42936e+00, 8.92722e-01, 4.26946e-03, 5.76027e-01, 1.74327e+00, -3.90950e-01, -3.79164e-01, -1.38847e-02, -8.74044e-01, -6.35221e-01, 2.36490e+00, -1.15012e+00, 1.30773e-02, 6.35102e-01, -5.66981e-02, -7.76175e-01, 2.09458e-01, 7.68279e-01, 2.82257e-02, -1.43689e+00, 1.45348e+00, -1.32275e-01, -6.52597e-01, -1.07390e+00, 3.67992e+00], [-8.93903e-01, -1.52696e-01, -2.05092e-01, -8.90282e-01, -2.00364e+00, 1.03875e+00, -1.32621e+00, -2.14113e+00, 2.21238e-03, 8.12214e-01, -1.41181e+00, -4.20050e-01, 4.41983e-01, 1.30917e+00, 3.85389e-01, -5.70749e-01, -4.91568e-02, 4.82110e-01, -1.25877e+00, -8.09701e-01, 3.82813e-02, 1.03367e+00, -7.14447e-02, 8.73666e-01, -1.85590e-01, 2.37245e-01, -2.18862e+00, -3.39054e-02, 5.74315e-02, 4.20319e-02, -1.34011e+00, 1.72452e-01, 1.32988e-02, -1.74418e-01, 3.46727e-01, -3.45556e+00, 1.11992e+00, -1.26685e-01, -3.45447e+00, 2.56293e+00, -1.33905e+00, 2.32492e-01, -1.10459e-01, -9.42548e-03, 1.47742e+00, 9.53528e-01, -4.29473e-01, 2.33290e-01, 7.41844e-01, -1.63200e-01], [-7.11406e-01, 1.76358e-01, 1.82661e-01, 1.37651e+00, 1.71296e-01, -3.77013e+00, 4.70689e-01, -1.19252e+00, 3.49210e-02, -5.45057e-01, -8.43555e-02, -1.01764e+00, 7.03205e-01, -5.50564e-01, -2.57998e-01, -8.90003e-02, -7.03442e-02, -2.16160e+00, -2.46453e-01, 3.27011e-01, -3.87644e-02, 1.25986e+00, -4.82131e-01, 1.16025e+00, -9.96877e-01, 1.01139e+00, 4.54536e-01, -2.34013e-04, -7.64689e-01, 1.13094e+00, 3.15832e-01, -5.18998e-01, 2.02894e-03, 7.86911e-02, -1.80465e-02, 7.24222e-01, -2.41294e+00, 1.07496e-01, -1.11151e+00, 1.52760e-01, -2.45497e-01, -8.63020e-02, -8.96264e-01, -4.23129e-02, 8.90333e-01, 1.23829e+00, -3.00661e-01, 1.02731e+00, 9.97125e-01, -9.64605e-01], [-1.16495e+00, -3.21318e-01, -2.32878e-01, -8.67667e-01, 8.09648e-01, 4.88990e-01, -2.42153e-01, 1.47975e+00, 2.43499e-02, 1.05052e+00, 3.60507e-01, 8.89850e-01, 1.61957e+00, 3.95841e-02, -1.80387e-01, 1.59727e+00, 1.00414e-01, -1.69962e-01, 3.22532e-01, 4.04049e-01, 4.49270e-02, 2.06025e-03, -1.13727e+00, -8.18494e-01, -2.46358e-02, 4.38166e-01, 4.55839e-01, 1.51633e-02, 1.09169e+00, 1.50812e-01, 1.64395e+00, 7.36603e-02, -1.52215e-02, 1.29634e-01, -5.58443e-01, -2.69559e+00, 4.25179e-01, -4.53843e-01, 3.99802e-01, 3.19833e-01, 8.93701e-01, -1.29397e+00, 1.00020e+00, 8.13036e-03, 1.02730e+00, 3.63057e-01, 7.76842e-01, 6.99263e-02, 4.17053e-01, 6.71006e-01], [4.13665e+00, 5.00456e-02, -1.34642e+00, 1.24221e+00, 8.29818e-01, -1.45188e+00, 6.56966e-01, 8.88003e-01, -3.73889e-02, 2.65558e+00, 2.52398e-01, -2.24852e+00, 2.92518e+00, 2.71676e+00, -9.87654e-01, 2.38644e+00, -8.43790e-02, 1.04393e+00, 2.45400e+00, 1.50747e+00, 6.77694e-02, 2.13449e+00, 1.61315e-02, 1.21737e+00, 2.50141e+00, 2.72715e+00, 2.70012e+00, 3.13854e-02, 1.93802e+00, -6.37446e-02, -1.17808e+00, -1.33022e+00, -2.09000e-02, -2.69960e-01, 5.27460e-01, 4.97982e-01, -2.34501e-01, -4.93726e-01, 3.85576e-01, 4.83983e-01, 1.36633e+00, 5.07154e-01, -1.40767e+00, 3.59732e-02, 9.36894e-01, 1.15858e+00, 6.19389e-01, 5.16815e-01, 5.23660e-01, -3.14797e+00], [-1.17314e+00, 1.72576e-01, -1.31059e+00, 3.00277e-01, -1.03053e+00, 7.50412e-01, 5.34606e-01, -1.27339e-02, 1.22410e-02, -3.17651e-01, -2.48858e-01, 4.19978e-02, 1.03757e+00, 1.11332e+00, 3.02777e-01, -3.95229e-01, -1.75081e-01, -4.70124e-01, 5.39680e-01, 1.42702e-01, -2.38310e-02, -2.03789e-02, -2.96087e-02, 2.74127e-01, 3.32722e-01, 1.38532e+00, 4.91408e-01, 1.00706e-02, 1.73434e-01, -1.89506e-01, 1.50722e+00, -1.28729e-01, 3.00097e-02, 6.92876e-01, 3.96345e-01, 9.36195e-01, 3.10122e-01, -2.01174e-01, 1.31424e+00, 6.40648e-01, 6.01806e-01, -6.55586e-01, -3.69063e-01, -1.91212e-02, -6.21453e-01, 1.08082e+00, -6.19932e-01, 2.32333e-01, 8.94868e-01, 9.51111e-01], [1.29563e+00, -2.92084e-01, -3.19046e-01, -1.71448e-01, 6.34968e-01, -5.71730e-01, -2.26099e-01, 3.80815e-01, -4.16583e-02, 3.95672e-01, -1.32231e-01, 4.48331e-01, 4.87361e-01, -7.38103e-01, 7.34906e-01, -1.38747e+00, -1.16242e+00, 9.12717e-01, -4.93262e+00, -5.20984e-01, 2.75182e-02, 5.18664e-01, 3.86817e-02, 1.16117e+00, 2.08286e-01, 1.25247e+00, -1.23102e+00, 2.59824e-02, -1.50012e+00, -1.90003e+00, -4.50514e-01, 2.07650e-01, 1.75540e-02, -4.96274e-01, 2.81842e-01, -1.05956e-01, 1.36957e-01, 6.10551e-02, 1.22848e+00, -7.19081e-01, -1.02814e+00, -3.27608e-01, -5.80142e-01, 2.12632e-02, 1.05033e+00, 3.03757e-01, -4.13065e-01, 7.35869e-01, -7.74691e-01, -7.41366e-01], [-4.85544e-01, -4.87780e-01, 7.39305e-01, 1.19273e-01, 5.64944e-01, 5.05106e-01, -2.88435e-01, -6.35080e-01, -5.22406e-03, 2.30368e-01, -9.65016e-03, 2.84249e-01, 2.17434e-02, -8.82583e-01, 5.09507e-02, -4.45779e+00, 2.86754e-01, -9.01804e-01, -9.93359e-01, 1.60678e-01, -1.49932e-02, -3.77201e-01, -4.34444e-02, 1.02306e+00, -4.16839e+00, -7.45453e-01, -2.19448e+00, -4.07771e-02, -2.22141e-01, 2.57391e-01, 3.39364e+00, 1.83447e-01, 1.19297e-02, -5.96744e-01, -2.13009e-01, -1.09955e+00, -4.74961e-01, 1.01982e-01, -9.87280e-01, 4.59385e-01, 4.49575e-01, -8.60569e-01, -1.73171e-01, 2.01082e-03, -8.18041e-02, -8.00228e-01, -2.12828e-01, 1.79371e-03, 9.48147e-02, 6.32344e-01], [-9.38857e-01, 3.07313e-01, -6.38307e-01, 6.65698e-01, -1.94453e-01, 6.24790e-01, 3.71000e-01, -4.53712e-02, -4.47095e-02, -3.89890e-01, -6.27483e-01, -6.28534e-02, -2.66001e-02, 1.20711e+00, 4.92953e-02, 6.62953e-01, -6.10669e-02, -3.56698e-01, -4.61248e-01, -6.37539e-02, 1.17070e-02, 5.24044e-01, 2.81860e-01, 4.94609e-01, -1.27683e-01, -2.52304e-01, -1.78619e+00, -2.30144e-02, -2.17412e+00, -9.06487e-01, 2.62667e-02, -1.59153e-01, -4.96529e-02, 2.43377e-01, 1.80458e-01, 2.31470e-01, -2.65090e-01, 2.09612e-02, 1.63652e-01, -7.65819e-02, 8.51666e-01, -5.59105e-01, -1.33219e-01, -2.32266e-02, 1.75753e-01, 8.45707e-01, 1.34143e-01, 5.73985e-01, -2.67262e-01, -4.53426e-02], [-4.40807e+00, 1.35937e+00, 4.54668e-01, -4.15228e-01, 5.32527e-01, 2.39034e-01, 4.48279e-01, -1.35992e+00, 8.20612e-03, -4.05411e-01, 2.94499e-01, 4.65990e-01, 2.30630e-01, -1.00471e+00, -5.92886e-01, -2.56858e+00, -6.30214e-02, -4.77935e-01, -7.72720e-01, -1.23143e+01, -1.56835e-02, -2.58485e+00, 1.76413e+00, 1.13340e+00, 3.76739e-01, 3.44102e-01, 2.07634e+00, -2.05071e-02, 6.20666e-01, -1.50840e+00, 1.25780e+00, -1.18277e-01, -5.06599e-02, 1.61037e+00, 1.37709e-01, 1.49770e+00, 1.07882e-01, 2.08711e-01, -1.07384e+00, -5.29449e-02, 4.43934e-01, -1.09310e+01, 7.09450e-01, 4.35541e-02, -3.07361e-01, -5.16853e+00, 3.62119e-01, -7.76565e+00, -7.58247e-01, 3.74978e-01]] +[-4.75840e+00, 3.79583e-01, -5.06998e-01, 1.09085e+00, -1.49557e+00, 1.21433e+00, 4.91423e-01, 1.95485e+00, -3.77245e-01, -1.77614e+00, -1.04228e+00, 2.09032e+00, -4.32128e+00, 1.02279e+00, -6.88991e-03, 2.35183e-01, 1.33161e+00, -2.92716e+00, 7.63796e-01, -3.55896e-01, -3.29070e+00, -2.40154e-02, -6.02375e+00, -4.28637e-01, -4.15211e-01, 6.87025e-01, 1.36443e-01, 1.14885e+00, 9.99994e-01, 1.45736e+00, 1.26868e+00, 7.50881e-01, -2.65271e-02, -1.11823e+00, 2.66772e+00, 1.66416e+00, -1.17216e+00, 1.26325e+00, -1.73007e+00, -2.44706e+00, -2.04990e+00, -6.05304e-01, -6.72521e-01, -1.62052e-01, -4.07908e-01, 5.80677e-01, -1.07161e+00, -2.63624e-01, -9.42639e-01, -1.28052e+00, ] +ReLU +[[5.19136e-02, -2.00269e-01, -4.26229e-02, -1.59031e-01, -2.67751e-01, 4.40366e-01, 1.34489e+00, -1.47498e+00, 6.08712e-02, -4.74853e-02, 6.60659e-01, 5.66330e-01, 9.93548e-02, -1.16069e+00, 2.82389e-02, 2.51944e-02, -1.59098e-01, -3.22951e-01, -1.29671e+00, 9.57487e-01, 8.03549e-02, 4.40509e-01, 3.61166e-01, -4.79554e-01, -6.21588e-02, -5.57276e-01, -3.80450e-02, -5.43562e-02, -1.30378e-01, -5.62407e+00, 4.26018e-01, 1.19472e+00, 5.34488e-02, -6.69682e-02, -5.49141e-02, -6.42156e-02, 5.68277e-04, -8.40401e-01, 1.08891e+00, -1.47462e+00, -6.13882e-01, -1.24668e+00, -5.53777e-01, 7.88761e-01, 3.37677e-01, 7.57222e-02, 2.94680e-01, 7.09958e-01, 9.68445e-01, 2.41409e-01], [2.34629e-01, -5.97305e-02, -4.47431e-01, 1.56002e+00, 6.08855e-01, 8.28696e-01, -3.65554e-02, 4.30920e-01, 1.14049e+00, -1.18192e-02, 1.99211e+00, -2.03180e-01, -9.06073e-01, -2.25907e-01, -2.09790e-02, -4.73343e-01, 1.62321e+00, 7.30986e-01, -1.19294e+00, 1.67443e+00, 8.19947e-04, 1.54636e+00, 3.90324e-01, -2.08924e+00, -6.36619e-01, -9.41192e-01, 4.01461e-02, -1.56947e+00, 1.17064e+00, 2.44283e-01, -2.15397e-01, -1.38885e-01, 2.52701e-02, -7.36750e-01, 1.62997e-01, 2.17372e-01, -1.31416e+00, 1.72175e+00, 6.40752e-01, 3.03605e-01, -1.12548e-01, 1.93011e-01, -5.04185e-02, -1.80201e+00, 4.78768e-01, 5.29603e-01, -1.66738e+00, -4.49070e-01, 2.56425e-02, -1.31933e-01], [-7.92953e-01, -5.38976e-02, 4.40294e-01, -4.96973e-01, -2.71960e-01, 6.15132e-01, -7.30991e-02, -1.15949e+00, -1.47599e-01, 4.97440e-01, -1.12964e+00, -4.28020e-01, -3.04430e-01, -4.85040e-01, -5.49857e-03, 6.07207e-01, 1.98786e-01, 9.66528e-01, 9.42709e-02, -1.56385e+00, 1.61906e-01, -4.82761e-01, 4.42221e-01, 1.41331e+00, 6.86739e-01, -1.59702e+00, -2.46111e+00, -2.89300e-01, -4.02657e-01, -3.88468e+00, 5.63007e-01, 6.32492e-01, -4.18108e-02, 8.31695e-01, -7.50390e-01, -2.05412e-01, 5.85854e-01, 3.10990e-01, -1.72229e+00, -2.68050e+00, -1.55836e+00, 7.92807e-01, -2.13623e+00, 2.71420e-02, -7.33606e-01, -7.78870e-01, -1.09083e-01, 3.12345e-01, -2.48067e+00, 8.26788e-01], [3.51216e-01, 9.21482e-01, -3.06941e+00, -4.74490e-02, -2.41958e-01, 7.12236e-01, -1.47326e+00, 5.09278e-01, 7.62347e-01, 7.42393e-01, -2.61301e-01, 3.12286e-01, 7.87030e-02, 2.05800e-01, 1.98414e-02, -8.33524e-01, -3.27340e-01, 1.17176e+00, -3.40969e+00, -3.14103e-01, -2.59559e-01, 9.18995e-01, -7.20834e-02, -7.89702e-01, -2.50995e-01, -2.39598e-01, -1.57677e-01, -8.67371e-01, 6.48934e-01, 4.25797e-01, -5.47417e-01, -9.18524e-01, 1.79248e-02, -1.84461e-01, 1.56339e-01, -3.60305e-01, -3.78013e-01, 1.49898e-01, 6.09986e-01, -1.41097e-01, -7.27958e-01, -1.28660e+00, -1.04718e+00, -2.10338e+00, -5.95467e-02, 9.27774e-01, 3.07658e+00, 1.95767e-01, 1.10977e+00, -7.60739e-01], [-2.66186e+00, 1.24384e+00, -5.39079e-01, 3.35702e-01, -1.31753e-01, -2.79916e-01, 1.12853e+00, -1.51964e+00, 6.95332e-01, 9.69214e-01, 6.85564e-01, 1.22417e-01, 1.16017e-02, 1.28853e+00, -1.82089e-02, 6.75219e-01, 9.25158e-01, -8.49396e-01, 5.75645e-01, 1.08048e+00, 5.09950e-01, -1.07584e+00, -1.16416e+00, 8.16172e-01, 4.52350e-01, -1.96470e+00, 3.16309e-01, 3.77616e-01, -1.07424e-01, -3.27485e+00, 5.09471e-01, 1.70718e+00, 1.05838e-02, -1.30218e+00, -8.58186e-01, 2.32611e-01, 3.06005e-01, 1.21878e+00, -4.48030e-01, 3.42165e-01, 1.03343e+00, -3.05181e+00, -7.17795e-01, 2.94256e-01, 9.79587e-01, 6.78161e-01, 3.70807e-01, 1.55609e+00, 8.36830e-01, -5.29629e-01], [1.61899e-01, -1.00164e+00, 2.45081e+00, 7.80050e-01, -5.88468e-01, -2.96394e-01, 1.39497e+00, -1.34225e+00, 1.18190e+00, -1.37847e+00, 2.94826e-01, -2.60175e-01, -4.08542e-01, 2.30565e-01, 2.00603e-02, -2.94692e-01, -1.14356e-01, 9.66576e-01, 1.76903e+00, 1.57958e+00, 3.03168e-01, 9.30826e-01, 2.63628e-01, -2.69470e+00, -3.17272e-01, -7.47781e-01, 4.56588e-01, 3.43413e-02, 1.41417e+00, -1.89575e+00, -2.26878e-01, 2.12501e-01, 3.55054e-02, 1.00451e+00, 1.26114e-01, 6.45614e-01, -7.39885e-01, 5.12281e-02, 3.64675e-01, 6.14492e-01, 9.75486e-01, -4.59342e-01, 1.34510e+00, 8.37772e-01, -5.29684e-01, 1.28574e-02, 5.76675e-01, 2.02144e-02, 1.85045e+00, 1.31870e-01], [7.92357e-01, -1.08027e+00, -9.95268e-01, 2.76520e-01, -1.92234e+00, 3.28422e-01, 1.15129e+00, -6.23960e-01, -1.10615e+00, -3.62288e+00, -7.53415e-01, -1.13146e+00, -7.54932e-03, 1.19118e+00, 2.98430e-02, 2.88210e-01, -2.33196e+00, 1.51039e+00, -6.97400e+00, -5.25726e-01, 4.18860e-01, -1.09895e+00, -3.43697e-01, -7.90122e+00, 1.79745e-02, -1.39403e+00, 1.71342e-01, 2.69027e-01, -2.64274e-01, -8.78389e+00, 1.43011e-01, 2.52530e+00, -1.89404e-02, 1.42152e+00, -4.33734e-01, -8.33581e-01, 2.12278e-01, 1.83612e+00, -3.22967e+00, -6.73611e+00, -2.26239e-02, -1.51358e-01, -3.38634e+00, -1.97023e+00, -1.65264e+00, 9.13262e-01, -4.91003e-02, 5.90626e-01, -2.27130e+00, -3.96953e-01], [8.99432e-01, -2.38260e-01, -1.10374e+00, -1.72744e-01, -4.81043e-01, 4.12001e-01, -2.51964e+00, 1.04829e+00, -1.32504e-03, -4.12740e-01, 1.04824e+00, -5.06958e-01, -5.09318e-01, -5.88392e-01, 1.00758e-02, -5.08050e-01, -1.03656e+00, 1.15646e+00, 9.31808e-01, 1.75594e+00, -1.87330e-02, 5.37314e-01, 1.07315e+00, 5.23173e-01, 1.84169e-01, 7.05052e-01, 2.26296e+00, 1.05995e-01, 3.19563e-01, -3.82294e-01, 3.31765e-01, 4.65293e-01, 1.44300e-02, 6.40664e-02, -6.47059e-01, -4.97911e-01, 4.79461e-01, 9.56916e-01, 2.17324e-01, -8.62018e-01, 6.87555e-01, 2.17070e+00, -4.63116e-01, 2.18711e+00, -6.13657e-01, 5.84218e-01, 8.31626e-01, 1.38103e+00, 2.72216e+00, 2.64943e-01], [-9.67107e-02, 1.99367e-01, 2.55067e-01, -1.14595e-01, -5.71101e-01, -6.31918e-01, -1.61256e-01, 1.74215e-01, -2.87846e-04, 1.83598e-01, 4.06276e-01, 9.70419e-02, 2.59328e-02, -3.61777e-01, 2.25990e-02, -1.79196e-01, 1.97951e-01, -5.11327e-01, -8.52470e-01, 2.57301e-01, 2.38646e-02, -7.17989e-01, 4.34110e-02, 3.42778e-01, 1.69665e-02, -9.97577e-01, 8.01579e-01, -2.59877e-01, 1.22434e-01, 5.88502e-01, -7.03006e-02, 1.13822e-01, 4.28795e-02, -1.14026e-01, 9.59111e-02, 1.07144e-02, 4.03823e-01, 2.31563e-01, 2.13772e-01, -3.54780e-01, 1.10668e-01, 2.06293e-01, -1.06669e-01, 3.26470e-01, -7.67990e-02, -3.26698e-01, 6.12875e-01, -1.14373e+00, 6.85833e-01, -7.43472e-02], [-5.88080e-01, 7.71646e-01, -1.00344e-01, 2.08753e-02, 1.65631e-01, -4.38035e-01, -1.47715e-01, 4.96797e-01, 8.51421e-01, 1.06480e-01, -1.38823e+00, -1.04941e+00, -3.10089e-01, -4.54686e-01, 3.94746e-02, 2.69318e-01, 6.92695e-03, -2.81538e+00, 1.35975e+00, 4.29399e-01, -6.32238e-02, 3.91565e-01, 1.62010e-01, -2.62083e-02, -1.13750e-01, 3.19889e-01, -3.52682e+00, -3.02632e-01, -4.00899e+00, -2.49229e+00, 2.47244e-01, -7.15367e-01, 3.56732e-02, -1.28022e+00, -7.15408e-02, -8.17780e-02, 3.46120e-01, 4.92068e-01, -2.71825e+00, -5.26228e-01, 1.38223e-01, -8.12498e-01, -1.96812e+00, -1.20875e-01, -4.35120e-01, -1.69795e+00, 1.82680e-01, -2.59328e-01, -1.67822e+00, 5.22220e-01], [3.81123e-01, -7.62666e-01, -2.56992e+00, 2.38603e-01, 1.82084e-01, -3.16824e-01, -1.32813e+00, 1.08764e+00, -1.53740e+00, -1.49292e-02, 2.99166e-01, -1.86331e-01, -9.86073e-02, 1.02623e+00, -2.51322e-02, -2.47488e-01, 1.47495e-02, -1.93742e-02, -1.97610e+00, -8.71127e-01, -3.75560e-01, -7.04642e-01, -1.56339e+00, -1.27271e+00, 2.70027e-01, 5.03804e-01, 4.85616e-01, 8.00128e-02, -1.66939e+00, -1.14296e+00, -5.75909e-01, 6.91028e-01, 3.77852e-02, -1.79415e+00, 1.97473e-01, 7.20992e-01, 1.85186e-01, -1.00730e+00, 4.95189e-01, 7.78345e-02, 5.73745e-02, -1.08209e+00, 3.98331e-01, 2.45103e-01, 2.26291e-01, -7.98801e-02, -7.12662e-01, -6.96840e-01, -1.49274e+00, -9.24998e-02], [2.89452e-02, 3.08396e-01, 7.40503e-02, 3.73864e-01, -3.19886e-01, 1.12413e+00, -4.86497e-01, -5.31623e-01, 9.35364e-01, 4.43707e-01, 3.01662e-01, 3.94600e-01, -1.15185e+00, -8.14012e-01, -9.46411e-03, -9.67283e-02, 9.83582e-01, 4.47538e-01, -2.19440e-01, 9.07611e-01, -2.86903e-02, -5.90789e-02, 4.99939e-01, 5.23673e-03, -1.78365e-01, 5.65684e-02, 1.16081e+00, 2.09240e-01, 2.14591e-01, -8.24015e-01, -4.92615e-01, 1.59810e+00, 1.57984e-03, -7.28647e-02, -3.80459e-01, -3.45840e-01, -4.44500e-01, 2.43317e-01, 2.13918e+00, 1.89145e-01, 2.27550e-01, 1.29836e+00, -4.00541e-01, 2.44653e-01, 4.59536e-01, 1.04334e+00, 8.83291e-01, 1.62399e+00, 1.75743e+00, -4.89200e-01], [4.46097e-01, 1.15297e+00, -2.26098e+00, 3.07568e-01, 2.08776e-01, -1.97459e-01, -2.15868e+00, 9.62286e-01, 2.06451e-01, -2.02673e-01, -1.14422e+00, -1.10362e-01, 7.65107e-02, -1.41238e+00, 1.08223e-03, 3.72360e-01, 3.16069e-01, -5.74136e-01, 2.20546e+00, -5.57032e-01, -3.83451e-01, 3.06205e-01, 1.19366e+00, 2.64931e-01, 1.43574e-01, 1.80007e-01, -1.36367e+00, 3.49073e-01, -1.21126e+00, -5.21616e+00, -9.40171e-01, -5.15666e+00, 2.14439e-02, -1.56110e+00, -1.11422e-01, 7.60257e-01, 4.85725e-01, -6.06020e-02, -4.83793e-01, -2.75026e-01, 1.48653e-01, 3.86866e-01, -1.20913e+00, -2.94809e+00, 9.80490e-01, -3.39997e-01, -3.62778e+00, 4.27257e-02, 7.39481e-01, 7.83626e-01], [-3.29968e-01, -1.62819e+00, 1.66059e+00, 2.16111e-01, 3.29460e-01, 8.89478e-01, 3.86181e+00, -2.25901e-01, 2.37161e+00, 1.33839e-01, 1.08872e+00, -1.46973e+00, -4.73800e-02, 1.25832e-01, -1.64973e-02, -2.47564e-01, 1.23120e+00, 8.79122e-02, 2.72738e+00, 1.33168e+00, 2.34054e-02, 7.41340e-01, 4.23118e-01, 1.00290e+00, -3.92486e-01, 2.45531e-01, 1.54707e+00, -9.71750e-01, 8.71307e-01, -4.42808e+00, -2.08779e-01, 4.63457e+00, -2.37739e-02, -6.57045e-01, -6.30811e-01, 1.71350e-01, 5.03536e-02, -1.13662e+00, 1.76797e+00, 2.85986e-01, 1.14325e+00, 8.60800e-01, 2.28190e+00, 4.34213e-01, 9.94010e-02, 1.31793e+00, 1.56467e+00, 1.55824e+00, 3.91222e+00, -4.29813e-01], [-2.45145e+00, -1.73437e+00, 1.29206e-01, -2.71519e-01, 5.55331e-01, 4.68121e-01, -1.46966e+00, 9.36053e-01, 1.02275e+00, 7.87598e-01, 1.74993e-01, 3.54113e-01, -9.02060e-02, -8.75590e-02, 4.71745e-02, 3.01135e-01, -9.10780e-01, 9.45516e-03, -4.37458e-01, 1.33849e+00, -4.53462e-02, -2.23666e+00, -2.06149e+00, -5.70809e-03, -2.30199e-01, -1.27081e+00, 7.15494e-01, -2.89670e-01, 7.77035e-01, -2.60008e+00, 3.75545e-01, -1.14964e+00, -5.62714e-03, -2.04219e+00, 2.63211e-01, 4.80638e-01, -9.79727e-01, -2.02571e+00, -3.27340e-01, 2.92223e-02, -2.06771e+00, -1.13367e+00, -2.80003e+00, 7.44747e-01, 7.01769e-02, -4.49736e-01, -1.16945e+00, 1.32128e+00, -1.95790e+00, 4.21129e-01], [-2.30854e-01, -1.75400e+00, 4.19677e+00, -8.86899e-01, -2.10686e+00, 3.73039e-01, -9.01762e-01, -2.53676e-01, 1.65058e+00, 1.70882e-01, 8.09002e-01, -1.14535e+00, 2.63829e-01, -2.71101e+00, -2.64349e-02, -1.26934e-01, 1.49113e+00, -3.96874e+00, -2.11080e-01, 1.49875e+00, -2.36562e-02, -1.82414e-01, 2.21144e+00, -1.12337e-01, -8.86934e-02, -2.29525e+00, 1.26535e+00, -1.24035e-01, 1.12925e+00, -3.25250e+00, 3.63521e-01, -2.08269e+00, -2.07515e-02, 8.93328e-02, -4.58185e-02, -9.98716e-01, -1.14581e+00, -1.90520e+00, -9.62013e-01, -2.17044e+00, 1.86292e+00, -6.63114e-01, -1.06282e+00, -8.12084e-01, 1.73062e-01, -7.69533e-01, 1.20381e+00, -1.11016e+00, -1.26962e+00, 1.92055e+00], [6.17007e-01, -3.10496e-01, -1.15302e+00, 3.91062e-01, 8.86864e-02, 5.46070e-01, -5.88040e-01, 4.73446e-01, 3.80690e-01, -2.94759e-01, -1.74653e+00, -2.66267e-01, 1.28987e-01, -1.26078e-02, 3.35644e-02, 1.30424e-01, 2.56538e-01, -6.37482e-01, 9.61027e-01, 6.83741e-01, -3.60184e-01, -4.41312e-01, 9.51181e-01, -6.91295e-01, -1.77043e-01, -6.19839e+00, -1.21952e+00, -1.03364e+00, 1.52940e+00, 1.38573e+00, -4.37789e-01, -9.14265e-01, 7.20218e-03, 4.43889e-01, 1.45870e-01, 5.85767e-01, -1.32620e+00, -1.03637e+00, 1.34354e+00, -3.14861e+00, 1.00419e-01, 2.76699e-01, -1.93366e-01, 1.97312e-01, -2.75597e-01, 1.22835e+00, -8.45186e-01, 8.58434e-03, 4.41803e-01, 1.16745e-01], [-1.50996e+00, 3.29201e-01, 4.74235e-01, 3.29240e-01, 4.21106e-01, 7.58647e-01, -1.34029e+00, -1.50342e+00, -3.95215e+00, -1.03483e+00, 2.04758e-01, -5.08581e-01, 1.30125e-01, -5.81111e+00, 3.73924e-03, -7.11796e-02, 6.05036e-01, 5.78812e-01, 2.97843e-01, -9.73112e-01, -6.80963e-02, -3.09258e+00, -1.70071e-01, -3.19754e+00, -5.54803e-02, -1.05589e+00, -2.37601e-01, 7.08790e-01, 7.34788e-01, -3.34329e+00, 1.60396e-01, 4.33559e-01, 4.20911e-02, 8.89801e-01, -1.54341e-01, -1.45419e+00, -4.07539e+00, -5.39132e-01, 1.02906e+00, 3.98172e-01, -7.26974e-01, 1.06519e+00, -3.06806e+00, -8.08403e-01, -6.09188e-01, 3.34717e-01, -3.23499e-01, -2.01256e+00, 1.18200e+00, -4.12968e-01], [4.17277e-01, 4.70157e-01, -3.04734e-01, 2.54255e-01, -6.47457e-02, 6.99537e-01, 1.27922e+00, -2.92214e-01, 9.79284e-01, -5.99566e-01, 1.80136e-01, 6.07470e-02, 1.71553e-01, -3.59202e-01, -2.70035e-03, 5.22072e-01, -4.04863e-01, 2.01981e+00, 1.14214e+00, 1.17589e+00, -2.14159e-01, 6.24797e-01, 4.97614e-01, -5.88212e-02, 3.27934e-01, -2.27321e-01, 1.33507e-01, 6.72009e-01, -8.47281e-01, -1.03701e+00, 3.73767e-01, -3.78245e-01, 4.19896e-02, 6.38102e-01, -1.05221e+00, -3.49715e-01, 1.90183e-01, 1.84427e+00, 9.45328e-01, -4.88974e-02, 7.28723e-02, 7.43613e-01, -2.72340e-01, 2.71342e-01, -7.67347e-02, 1.91290e+00, 3.92881e-01, 1.52813e+00, 2.21703e+00, -1.47028e-01], [9.02981e-01, 7.75881e-01, 5.10491e+00, -1.60335e+00, -2.09663e+00, 3.44066e-01, 1.71672e+00, 5.39906e-01, 1.43937e+00, 1.55235e+00, 2.21292e+00, -1.16839e+00, 1.25889e+00, -3.65494e+00, -1.82842e-02, 1.56503e-01, 3.31822e+00, 1.10114e+00, 3.19125e+00, -5.21336e-01, 6.13761e-01, 1.49523e+00, 5.81074e+00, 3.25406e+00, 4.23819e-01, -4.64705e+00, 2.82325e+00, 1.82737e-01, 3.52587e+00, -1.52101e-01, 1.71337e+00, 5.40121e-01, 8.59908e-03, 8.41462e-01, -6.73745e-01, -1.54115e+00, -1.86221e+00, -6.05083e-01, -4.20209e-01, -3.80179e+00, 1.59635e+00, 2.53970e+00, -3.28612e-01, 1.66941e+00, -1.59916e+00, -3.11441e-01, 3.63203e+00, 9.89133e-01, 2.09230e+00, 4.10895e+00], [2.23625e-01, -3.80332e-01, 1.43934e+00, 1.19167e-01, -3.48384e-02, -4.37114e-01, 2.41064e-01, -8.17466e-01, -2.80447e-01, -2.48287e-02, -4.01726e-01, -2.85795e-01, -3.85839e-02, -5.13484e-01, 3.28726e-02, -2.80641e-01, 4.71727e-01, -2.21727e-01, 1.69059e+00, 4.45662e-01, 7.24608e-02, -2.60117e-01, 1.89267e-01, -6.86889e-01, -5.82602e-02, -4.50703e-01, -3.77851e-01, 3.26467e-01, 4.00518e-01, -8.24233e-01, 4.37385e-01, -4.35948e-01, 1.86817e-02, 4.71310e-01, 4.46839e-02, 4.42628e-02, -4.13336e-01, -3.73927e-01, 8.23153e-01, 8.07048e-02, 1.48789e-01, 2.63043e-01, 1.55506e-01, 6.79601e-01, -1.03035e-01, 4.04905e-02, 2.40346e-02, 4.78522e-02, 1.20338e-01, -1.03656e-01], [2.87341e-01, -1.40451e-01, 1.88817e+00, 2.77305e-01, 1.47120e-02, -5.34649e-01, 1.56067e+00, 1.05720e+00, 1.62424e+00, -3.43422e+00, 7.17236e-01, -3.90227e-02, -3.67436e-01, -1.61018e+00, 2.23958e-02, 8.20654e-01, -9.70475e-01, -7.61537e-01, 7.83374e-01, 1.02280e+00, -1.03806e-01, 4.34478e-01, 9.53853e-01, 8.39122e-02, -1.02087e-01, -4.05621e-01, 1.11522e+00, -1.59558e-01, -1.62378e+00, -4.30368e+00, 7.21454e-01, 3.89078e-01, 2.46398e-02, 2.27541e-01, -3.23654e-01, -5.61871e+00, -1.05314e+00, -6.45374e-01, -1.29372e+00, 9.00936e-02, 1.31030e-01, -5.86302e+00, -2.57770e+00, -3.50010e+00, -5.57443e-01, 1.04876e+00, -7.40601e-01, 1.21494e+00, -1.43930e+00, 3.47622e-01], [2.43261e-01, -6.49793e-01, -7.20191e+00, -6.86781e-01, -1.64340e-01, -3.25899e-01, -1.14427e-01, -1.10477e+00, -3.31923e+00, 1.08087e-01, -2.91978e-01, 4.16390e-01, 1.27213e-01, -1.01134e+00, 2.73625e-02, 2.57958e-01, 4.41839e-02, -5.57452e-01, -1.85788e+00, -9.39608e-01, -1.67163e-01, -1.61097e+00, -3.95572e-01, 1.31799e-01, 1.26379e-02, 6.11791e-02, 1.39844e+00, -9.37690e-02, 1.36560e+00, -4.31930e+00, -7.57487e-02, 1.13673e+00, 5.21437e-03, -2.55735e-01, 5.96366e-02, 3.67513e-01, 4.57397e-01, -5.80749e-01, 6.98944e-01, -1.32318e+00, -1.39551e+00, -4.26806e-01, 4.67678e-01, -1.41507e-01, -1.73446e+00, 1.28847e-02, -1.94601e+00, -4.82891e+00, -2.30152e+00, 2.13977e-01], [6.52761e-01, -1.05504e+00, -3.84814e+00, 1.73259e+00, -5.99051e-01, 2.29324e-01, -5.64198e-01, -2.03993e+00, -3.09808e+00, -9.01188e-01, -8.24366e-01, -5.82802e-01, -1.08613e+00, -3.51408e-01, 1.87686e-02, -8.14117e-01, -8.26484e-01, 4.30169e-01, -3.88360e+00, 2.57122e-01, -5.87505e-01, -6.12579e-02, 1.63073e-01, -1.28193e-02, -7.71030e-01, 1.40356e+00, -2.99333e+00, -1.38413e+00, -2.40829e-01, -4.54657e+00, 8.67253e-02, -3.78366e+00, 4.19323e-02, -5.07227e-01, 9.36123e-02, 7.93768e-01, -5.60176e-01, 6.25916e-01, -6.53086e-01, -5.58337e+00, -1.38359e+00, -2.54794e+00, 1.95372e+00, -6.55165e+00, 9.27720e-01, 1.85094e-01, -2.38197e+00, -1.48056e+00, -1.64499e+00, 8.60377e-01], [-6.28770e-01, -7.20351e-01, -2.26280e+00, 7.60752e-01, -7.01001e-01, 5.68658e-01, 3.87050e-01, -2.55587e-01, 3.97236e-01, 1.16621e-01, 4.44726e-01, -2.00186e-01, 5.48190e-02, -7.10606e-01, -2.19708e-03, -7.12177e-01, 7.86979e-01, 6.14133e-01, 7.49584e-01, 1.11317e+00, -2.00812e-01, 5.41360e-01, 5.91452e-01, -2.37736e-01, -2.01930e-02, -8.50972e-02, 7.48735e-01, 3.31415e-01, -6.94473e-02, -7.23138e+00, 1.03909e+00, -4.18355e-01, -4.34431e-03, -2.44863e+00, -4.02912e-01, 4.98261e-01, -3.32122e-01, 1.10478e+00, 3.29236e+00, 1.02213e+00, 4.39320e-01, 8.54766e-01, -1.22000e+00, 9.34070e-02, -1.35838e-01, 7.21401e-01, 6.07122e-01, 4.61127e-01, 1.25614e+00, 2.17295e-03], [2.92554e-01, 6.41855e-02, 7.33020e-01, -1.59283e-01, -6.68526e-01, -1.59308e+00, 5.83611e-01, 7.37318e-01, -1.89734e-02, -1.74348e-01, 2.71493e-01, -1.13856e-02, 6.93693e-02, -6.11726e-01, -3.62093e-02, 1.83676e-01, 3.69650e-01, 4.46872e-01, 1.13845e+00, 8.25846e-01, -1.17695e-01, 4.25602e-01, -5.56867e-01, 6.78102e-01, 1.36070e-01, -5.14398e-01, -1.78835e-02, -1.03073e-01, 4.14316e-01, -7.82213e-03, 7.92344e-01, 3.07211e-01, 8.59575e-03, -2.86918e-01, -7.59876e-02, -5.90779e-02, 1.33786e-01, -7.15483e-01, 2.68428e-01, -4.33659e-01, 8.05221e-01, 1.90336e+00, -2.55638e-01, 4.99404e-01, -3.93356e-01, 1.13263e-01, 1.13147e+00, -2.09274e-01, 1.75277e-01, -6.62856e-01], [-2.29749e+00, -1.19341e+00, 1.03539e+00, -2.12913e+00, -2.92815e+00, -3.76708e+00, -4.69158e+00, -4.96701e+00, -4.80254e+00, -7.34070e-01, -1.44665e+00, -4.27258e+00, 2.16265e+00, 4.77764e-01, 2.06256e-02, -3.87622e+00, 2.50316e+00, -1.44603e+00, -9.79311e+00, -3.56524e+00, -2.86298e-01, 1.25080e+00, 4.51705e+00, -2.82357e+00, -3.13944e-01, -1.84204e+00, -4.72040e+00, -2.09062e+00, 5.80938e-01, 2.86190e-01, -2.73625e+00, -2.22091e+00, -2.63748e-02, 1.18363e+00, 8.02272e-01, -3.11964e+00, -4.05720e+00, -1.69666e+00, -1.05786e+00, 7.68099e-02, 7.97525e-01, -1.21725e+00, -1.75995e+00, -6.46924e-02, -1.91850e+00, -2.64612e+00, -2.23840e+00, -1.87201e-01, -1.21636e+00, -2.16651e+00], [-1.38364e+00, 2.14014e-01, -4.09091e+00, 6.23618e-01, -7.69398e-01, 1.54183e-01, 1.62279e+00, 1.25029e+00, -1.35177e+00, -2.66252e-02, 5.36268e-01, -8.01668e-01, 3.94286e-01, 2.17980e-02, 2.10118e-02, -5.06620e-01, 3.42223e-01, 1.94322e-01, 2.39925e+00, -3.92085e+00, 3.28173e-01, 1.10585e+00, 1.22206e-02, -1.40002e+00, 1.82672e-02, -6.01944e-01, -1.28491e+00, -5.51495e-01, -2.38014e+00, 1.87124e+00, -3.71008e-02, 4.10915e-01, 3.27690e-02, -2.68127e-01, -9.72669e-02, 3.96579e-02, -1.07570e-01, -4.27204e-02, -1.46339e+00, -8.34221e-01, -8.46382e-01, -1.33855e+00, -2.53558e-02, 1.34861e+00, 7.38152e-01, -1.18227e+00, 1.53267e+00, 3.01420e-01, -1.26878e+00, 2.24992e-01], [-2.44372e-01, -9.42011e-01, -8.49915e-01, -1.13883e-01, -1.99636e-01, 1.96337e-01, 2.07320e-01, 4.74925e-02, -3.61615e-01, 1.01549e-01, 8.44478e-01, 3.16531e-01, -1.92316e-01, -1.17013e-01, -4.46175e-02, -4.04068e-01, 3.84971e-01, -1.61005e-01, 2.98938e-01, -1.01137e+00, -9.46489e-02, 7.53385e-01, -7.56761e-01, 1.88045e-01, -1.91192e-01, -1.11564e+00, 3.55740e-01, -9.96113e-02, -1.06667e-01, 1.28855e+00, -2.94477e-01, 1.91219e+00, -1.54850e-02, -1.41862e+00, 2.76356e-01, 1.73453e-01, -1.28837e-01, 8.44988e-01, -5.32484e+00, 2.86083e-01, 3.34591e-01, -1.16453e+00, -1.42488e-01, -1.48510e+00, -5.08893e-01, -9.07552e-01, -1.32138e+00, 1.91280e-01, -2.15347e+00, 1.56641e-01], [-4.92856e+00, 2.30687e-01, 2.37506e+00, 1.07853e-01, 8.13979e-01, 8.13004e-01, -1.00624e+00, 3.11985e-03, -1.32714e+00, -7.52417e-01, -5.36776e-01, -6.85184e-01, -1.98380e-01, -7.59027e-01, -3.17200e-02, -2.55450e-01, -2.14142e-01, -6.27586e+00, -6.67693e+00, 2.71466e-01, 1.72569e-01, -1.05513e+00, -1.61747e+00, 2.49511e-01, 1.19728e-01, -1.88606e+00, 1.26403e+00, -1.13389e-01, -3.55110e-01, -2.07269e-01, 2.29823e-01, 6.90132e-01, -1.01198e-02, -1.04141e+00, -7.55718e-02, 4.57613e-01, -9.10514e-01, -9.15075e-01, -2.36587e+00, -5.47619e+00, -9.58548e-01, 6.54338e-01, -2.64646e+00, -8.69313e-01, -1.81552e+00, -1.59107e+00, -4.23127e-01, -1.73417e-01, -2.65947e+00, -5.24648e-02], [-4.37612e-01, 1.62187e-01, -3.10504e-01, -3.94755e-01, 1.67468e-01, 5.97277e-02, 4.99477e-01, 7.49049e-02, -9.28085e-02, 2.33225e-01, 3.39826e-01, -9.69465e-03, -9.13566e-02, 1.09275e-01, -1.41858e-02, 1.81221e-01, -1.39853e-01, 6.01756e-01, 7.19346e-01, -8.44182e-01, 1.51978e-01, 1.66261e-01, 3.29762e-02, 3.09099e-01, 1.80120e-02, -1.00789e-01, 5.66051e-01, -1.39383e-01, -7.34174e-01, -8.42189e-02, -3.23906e-01, -6.14663e-01, -4.40075e-02, 6.29670e-01, -5.67361e-03, -7.24020e-02, 3.21718e-01, -2.58162e-01, -6.10040e-01, 1.33284e-01, -1.37826e-01, 4.29932e-01, 9.02369e-01, -9.09749e-01, -2.02792e-01, -6.65917e-01, -1.08253e+00, -1.04190e-01, 2.80833e-01, -2.24982e-01], [1.14962e+00, -7.75511e-01, -3.91116e+00, -3.26376e+00, -1.55255e+00, -1.00861e+00, -8.29701e+00, -2.20342e+00, 1.79527e+00, -1.44571e-01, -8.54935e-01, -2.27522e+00, -1.72488e-01, -1.29220e+00, 5.45484e-03, 7.17895e-02, 4.04762e-01, 1.05616e+00, -3.70061e+00, 4.23759e+00, 7.29109e-01, -3.06483e+00, -1.61222e+00, -1.58457e+00, -8.77102e-01, -5.04688e+00, -3.05969e+00, -9.53124e-01, -3.67982e+00, -9.96733e-01, -4.01551e+00, -1.15457e+00, 4.56674e-02, 8.78015e-01, -7.14578e-01, 8.64322e-01, -3.28829e-01, -1.95845e+00, -2.84739e+00, -2.99542e+00, 1.63110e-01, 2.39882e+00, -4.06962e-01, -2.42268e+00, -4.10679e-01, -5.31114e+00, -2.44436e+00, -9.29814e-01, -3.58355e+00, 2.45041e-01], [-2.29046e+00, 1.66318e+00, 9.27851e-01, -4.58969e-01, -1.51077e+00, 1.77796e-01, -6.26269e+00, -1.81648e-01, 1.91397e+00, 3.18219e-01, 1.34018e-01, -2.17644e+00, -1.05835e+00, -1.76966e+00, -2.62099e-02, -4.12778e-01, -3.79291e+00, -2.07517e+00, 7.44914e-01, 2.39692e+00, 1.94958e-02, 7.09861e-01, -1.65463e+00, 1.12370e+00, 2.08675e-01, -1.88067e+00, 7.90899e-01, -1.50417e+00, -3.63592e+00, -5.04507e-01, -8.83295e-01, -3.45571e+00, 2.24585e-02, 2.12501e+00, -1.69675e-02, -1.26503e-03, -1.68353e+00, -1.20277e+00, 2.18217e+00, -4.68581e-01, 6.41219e-01, -5.38276e+00, 4.74274e-01, -3.52414e+00, -3.64570e+00, -2.43470e-01, -1.06788e+00, 7.28165e-01, 1.85428e+00, 2.65814e+00], [-4.39517e-01, -4.01939e-01, -4.65354e+00, -2.70405e-01, -3.93723e+00, -6.45251e-02, -9.64843e-01, -4.30279e-01, -1.94079e+00, 3.01673e-01, 2.11990e-01, -3.19925e-01, 1.83450e-01, -8.80257e-02, 2.15589e-03, -7.09775e-02, -1.61921e-01, 7.08850e-01, -2.59316e+00, -1.10551e+00, -3.56165e-01, 7.89682e-01, -6.53471e-01, -1.09068e+00, -3.79021e-01, -5.90536e+00, -2.26696e+00, 3.79603e-01, 5.82230e-01, -2.55406e+00, -2.74157e-01, 6.55188e-01, -2.74450e-02, -2.41146e+00, 2.90479e-01, -9.54303e-02, 1.51802e-01, -1.76250e-02, 1.33550e+00, -1.92613e+00, -2.71310e-01, 4.32118e-01, -3.00022e+00, -7.27421e-02, 6.11645e-01, 7.30722e-01, -3.68621e-01, -6.03490e-01, 2.01291e+00, 8.39722e-02], [-5.38022e-01, -3.78284e+00, -5.59422e+00, -4.99422e-01, -3.37232e+00, -1.79690e+00, -2.63251e+00, -2.22473e+00, -7.01809e+00, -8.02500e-01, -1.63968e+00, -2.78447e+00, -4.50211e-01, -2.76751e+00, -2.93707e-03, 4.44418e-01, 1.10521e-01, -7.40463e+00, -8.09484e+00, -4.69054e+00, -1.27905e-01, -1.74789e+00, 3.75064e+00, -1.00851e+00, 1.32403e+00, -1.08826e+01, -2.37339e+00, -1.02044e-01, -7.99619e+00, -4.09112e+00, -1.75782e+00, -6.04308e+00, 3.81204e-02, 1.30608e-01, -1.59431e+00, -1.59861e+00, -2.73368e+00, -4.03081e+00, -4.44520e+00, -5.49106e+00, -6.39109e-01, -2.85942e+00, -4.87067e+00, -7.60012e+00, -6.75100e+00, -8.81523e-02, -2.36165e+00, -5.78648e+00, 4.51630e-02, -7.48172e-02], [2.48799e-01, -2.38020e+00, 2.69021e-01, 1.06306e+00, -8.82979e-01, -1.27252e+00, -3.88496e+00, 2.31162e+00, -1.06152e+00, 2.47584e-02, 1.47591e+00, -1.39548e-01, -1.10305e-01, 8.77777e-01, -1.64891e-02, 8.93357e-02, -4.35205e-01, -3.84275e+00, -3.89825e+00, 5.13438e-01, 1.89303e-01, -1.59637e+00, -2.22433e-01, -1.31005e+00, 3.84625e-02, -1.10274e-02, 1.20729e+00, 5.85164e-01, -7.30514e-01, -4.97837e+00, -3.72989e-01, 2.96782e-01, 1.25307e-02, -1.37989e+00, -6.39655e-01, -1.94068e-01, -5.09168e-01, -8.83262e-01, -1.90907e+00, -1.40025e+00, -9.13267e-01, -9.52393e-01, -1.23752e+00, -3.11042e+00, -1.63160e-01, -2.25418e-01, -6.48711e+00, 6.29674e-01, -6.99634e-01, 5.89692e-01], [-8.15446e-01, 1.03125e+00, -3.39009e-02, -2.73839e-01, -1.02240e+00, -2.21312e-01, -2.31535e-01, -1.60418e+00, 2.26417e+00, -3.51616e-01, -7.76774e-01, -9.37367e-01, -2.67774e-01, 2.47849e-01, -4.07670e-02, 3.49980e-01, -2.58998e-01, 1.51215e+00, 1.91898e+00, 2.32754e+00, -1.88283e-01, -3.45112e-02, 9.64715e-01, 8.19827e-01, -7.54490e-01, 3.32623e-01, -2.79679e-01, 6.91614e-01, -5.38446e-01, -2.49607e+00, 7.53562e-01, 1.74887e+00, 3.61338e-02, 1.58369e+00, -2.38519e-01, -2.60236e-01, -8.69128e-01, 7.86668e-01, 2.31001e+00, 6.32954e-01, 1.19188e+00, 5.88698e-01, 1.69341e+00, 2.03707e+00, 4.46628e-01, 1.98748e+00, -9.10195e-01, 1.53434e+00, 4.28250e+00, -1.58912e-01], [-8.71644e-02, 2.63664e-01, 5.58545e-01, 5.65180e-01, -5.63202e-01, 8.69060e-01, -4.50458e-01, -2.92695e-01, -6.36907e-01, 5.50168e-01, 3.49467e-01, -3.41496e-01, -3.70225e-01, 2.46899e-03, 1.58142e-02, 3.46980e-01, 1.11573e-01, 7.32965e-01, -1.24791e+00, -5.90511e-01, -2.75209e-01, -6.67188e-01, -2.64006e-01, -1.29038e-01, -1.01700e+00, -1.04586e+00, 2.30130e-01, -5.70890e-01, 3.92943e-01, -2.84300e-01, 5.75949e-01, 1.26693e+00, 1.59586e-02, 8.23553e-01, 6.99722e-03, -2.31825e-01, -3.68705e-01, 1.47989e+00, 9.38766e-01, -4.08498e-02, 3.81365e-01, 2.08034e-01, -2.74633e+00, 1.43703e+00, 5.01228e-01, 2.33169e+00, -1.46005e+00, 1.83871e+00, -1.79461e+00, 1.91986e-01], [1.19362e-01, -6.98820e-01, -9.60015e-02, 5.02764e-01, -8.67966e-02, 2.54915e-01, 1.91280e+00, 1.36169e+00, -4.09533e-01, -1.90568e-01, -3.14982e-01, -4.57549e-02, 2.05958e-01, -1.40517e-01, 5.56401e-02, -2.02924e-01, 3.04991e-01, 7.21910e-01, -9.82833e-01, -2.63847e-01, -1.75639e-01, 1.18862e-01, 8.39902e-01, -9.10782e-01, -2.61454e-01, -3.91536e-01, 9.58718e-02, 5.55136e-01, 1.70877e+00, 4.25047e-01, 1.63474e-01, 1.35056e-01, -4.79234e-02, -4.08492e+00, -3.79643e-01, 1.32035e-01, -5.14809e-04, 3.15314e-01, -4.14490e-01, -1.29126e-01, 7.86313e-01, -1.07017e+00, -3.28902e-01, 5.26655e-01, 4.36413e-01, 9.35237e-01, -1.43470e-01, -1.33395e-01, 4.07560e-02, 3.97460e-02], [-3.66573e+00, -2.98989e+00, -3.01107e+00, -1.63794e+00, -1.75452e+00, 7.89156e-02, -3.65996e+00, -6.17783e+00, 2.55230e-01, -1.87364e+00, -6.92729e+00, 3.56433e-01, -9.36405e-01, -2.69711e-01, 3.16942e-02, 1.75457e+00, 3.22067e-01, -5.77718e+00, 1.10648e-01, 3.78151e-01, 2.24247e-01, -2.87166e+00, 3.08073e-01, 4.92934e-01, 2.50073e-01, -1.15063e+00, -3.30799e+00, -8.24178e-01, -4.24666e+00, -1.64242e+00, -5.84805e+00, -1.17591e+01, 1.65436e-02, -4.07851e+00, -7.15050e-01, 4.75519e-01, 8.90173e-01, -6.79930e-01, -5.76747e+00, 1.61083e+00, -5.60414e+00, 3.47377e-01, -6.56600e+00, -3.78109e+00, -7.31797e+00, -1.86931e+00, -8.33340e-01, -4.99111e+00, -9.34789e+00, 6.85211e-01], [-1.74261e-01, -2.77508e-01, -3.74108e-01, 1.52424e-02, -2.36495e-01, 3.85416e-01, 4.72515e-01, 1.37004e-01, -3.70149e-01, -1.29453e+00, -7.17721e-02, -1.92777e-01, -2.11782e-01, -6.73947e-01, -1.95487e-02, 7.85269e-02, -2.45872e-01, 5.13129e-01, -4.26136e-01, -3.39272e-02, 3.01613e-02, 5.08354e-01, -1.07195e+00, 4.25253e-01, -4.59922e-01, 3.41938e-01, 5.24037e-01, -9.14013e-02, -4.09955e-01, 3.90685e-01, 7.25692e-02, -3.33656e-01, 5.49086e-02, -2.39161e+00, -5.72265e-02, -6.05796e-01, -5.07746e-01, 7.22994e-01, -1.18977e-01, -6.90312e-02, 7.41007e-01, 4.65404e-01, 1.84690e+00, -3.06096e-01, 8.01279e-02, -7.99592e-01, 1.33910e-04, -2.21385e-01, -6.75938e-01, 3.67827e-01], [-6.66876e-02, 1.32470e+00, 9.40520e-01, 5.71647e-01, -1.35444e+00, 1.64862e-01, 4.53429e+00, 1.20297e+00, 3.01078e+00, -1.01407e-01, -2.32388e+00, -7.00781e-01, 5.99230e-01, -1.77688e-01, 1.07009e-02, -4.21138e-01, 1.63150e+00, 1.11920e+00, 4.05497e+00, -4.50796e-01, -7.05118e-02, 1.65457e+00, 1.35826e+00, 4.66355e-01, -5.98964e-01, 8.73992e-01, 2.68905e+00, 5.87339e-01, -6.39892e-01, -4.68281e+00, -2.02020e+00, 3.80146e+00, 4.04847e-02, 2.54453e+00, -2.14245e-01, -4.34399e-01, -1.99194e+00, 7.23263e-01, -5.77973e-01, 8.54587e-01, -1.76843e-01, -2.27620e+00, 4.11614e-02, 1.27385e+00, -2.93333e-01, 2.41305e+00, -2.56884e-01, 2.38013e+00, -2.68955e+00, -6.26709e-01], [-6.64053e-01, 1.83214e+00, 2.54757e+00, -1.14652e+00, -7.67734e-01, -3.77224e-01, 3.40346e-01, -7.37674e-01, 2.13007e-01, 7.80288e-02, -8.49065e-01, 1.04029e-01, 1.06526e-01, -9.26380e-01, 2.23856e-02, 3.38121e-01, 1.00046e+00, 2.99760e-01, 2.73187e+00, 1.62815e-01, 1.59352e-01, 4.70198e-01, -5.46801e-01, 2.05197e+00, 3.02858e-01, -1.32925e+00, 3.15112e-01, -1.41385e+00, -2.02484e-01, -7.38280e+00, -3.26676e-02, 2.77092e+00, 4.01513e-02, 1.19199e+00, -4.84655e-01, -4.61629e-01, 1.44020e-01, 1.50550e+00, -6.02605e-01, -1.86137e+00, -7.56712e-01, 3.25568e+00, 1.36560e+00, 1.28086e+00, 9.45147e-02, 1.29027e+00, 2.10987e+00, 2.78315e+00, 1.03642e+00, -9.94671e-02], [5.01365e-01, 7.83697e-01, -4.29486e+00, -1.72538e+00, 2.19097e-01, -2.75698e-01, 8.27905e-01, 3.19050e+00, 3.52515e-01, 5.98090e-01, -1.97680e+00, -4.30204e-01, -6.45983e-01, 1.60016e-01, 1.42275e-02, 2.74276e-01, 7.44652e-01, 1.23905e+00, 1.42471e+00, -1.70681e+00, -1.59329e-01, -5.83686e-01, 1.84323e-01, -1.64233e+00, -5.87334e-01, -2.21767e+00, 2.42875e+00, 2.63013e-01, 5.51901e-01, -5.09307e+00, 4.15355e-01, -8.90813e-01, 3.06640e-02, -3.12605e+00, 2.41148e-01, -8.43209e-01, -3.33399e+00, -2.57712e+00, -2.70844e+00, -9.51719e-01, -1.87549e+00, -2.88646e+00, 5.76250e-01, 4.46841e-01, 1.20581e+00, -2.58915e+00, 6.28812e-01, -1.44255e+00, -1.69105e+00, -5.11532e-02], [-4.36842e+00, -7.80447e-01, -3.13706e+00, -1.84754e-01, 2.50005e-01, -1.74459e-01, -1.80512e+00, 1.86912e-01, -5.31486e-01, 5.48927e-01, -3.08020e-02, -3.89521e-02, -1.13974e-02, 8.29366e-01, 1.27621e-02, -1.80523e-01, -1.35983e+00, -3.49351e-01, -8.73828e-01, 6.51319e-01, -2.06648e-01, 7.55798e-01, -4.59727e+00, -3.66911e+00, 2.95698e-01, -1.12732e+00, 7.71073e-01, -2.19157e+00, -1.16954e+00, 6.47328e-01, 7.01036e-01, -4.71021e-01, 3.93557e-02, -3.61217e+00, -3.23065e-01, -2.88802e-01, 1.99227e-01, -1.34621e-01, 5.50402e-01, -1.03328e+00, 7.50386e-01, -6.13227e+00, -3.70324e-01, -2.86706e-01, -7.13621e-01, -6.19686e-01, -7.80531e-01, 7.81767e-01, -2.67627e+00, 2.70817e-01], [-1.57486e+00, 1.28541e+00, 4.58448e-01, -5.10947e-02, -2.20907e-01, -7.84568e-02, -5.21828e-01, -5.73546e-01, 4.74225e-01, 5.95780e-01, -6.03549e-01, -4.35729e-01, 4.51141e-01, -2.10446e+00, -9.29320e-03, -2.81281e-01, 1.41657e+00, -2.65503e+00, 1.28518e+00, -1.08327e-02, 1.14359e-01, 2.37947e+00, 3.59103e+00, -1.96641e+00, 1.61679e-02, -6.61578e+00, 1.98337e-02, -1.23255e+00, 3.00200e-02, -1.51453e+00, 6.15552e-01, 6.06217e-01, 4.54486e-02, 1.28380e+00, -2.95426e-01, -8.00468e-01, 1.13939e-01, -3.09906e+00, 1.43952e+00, -6.48515e+00, 1.01555e+00, 5.41274e-01, -6.68477e-01, -3.99673e+00, 7.47875e-01, -1.20212e+00, -6.79364e-01, -3.35328e-02, -1.18300e+00, 1.35567e+00], [1.24821e+00, -2.64698e+00, -3.16755e+00, -2.02530e+00, -9.33289e-01, -1.86687e+00, -2.54084e+00, 2.01395e+00, -1.68371e+00, -2.51413e-01, 2.97694e-01, 9.86852e-01, -1.77083e-01, -6.03883e-02, -2.67881e-02, 2.19772e-01, -7.49554e-01, -1.61232e+00, 1.32252e-01, -1.32251e+00, -5.87595e-02, 1.63041e+00, 5.86008e-01, 9.52544e-01, -7.30258e-01, -1.52099e+00, 4.27614e-01, 6.91969e-01, 9.70787e-02, -1.29346e-01, 5.21465e-01, -1.55402e+00, -2.55829e-02, -1.66333e+00, 1.90106e-01, -1.08925e+00, -1.82907e-02, -3.15702e-01, -5.49967e+00, -2.93714e+00, -2.57549e+00, 7.58074e-01, -2.28113e-01, -1.30767e+00, 1.73587e+00, 1.47924e-02, 1.15064e+00, -7.41941e-01, -4.18180e+00, -2.40991e-01], [-7.18075e+00, -1.84612e+00, -4.36677e-01, -1.53643e+00, -3.40850e+00, -5.97392e+00, -1.79795e-01, -2.87522e+00, 2.69574e+00, 1.70120e+00, -4.86570e-01, -6.52904e-01, -1.44958e+00, 1.36454e+00, -3.73875e-02, -4.34038e+00, 3.94050e-01, -5.50495e+00, 3.05384e+00, -3.41265e+00, 7.44618e-01, -6.43285e+00, 2.62432e+00, -7.36842e+00, -5.61402e-01, -4.27963e-01, -5.29934e+00, 1.24759e+00, 5.36471e+00, -1.34494e+00, 1.14128e+00, -3.53248e+00, -4.04875e-02, -6.45920e-01, 8.23690e-02, -4.42536e+00, -5.37522e+00, 2.05143e+00, -2.01793e+00, -3.11172e+00, -5.25716e+00, -1.64227e+00, 3.17041e-01, -5.34390e+00, -2.07002e+00, -7.27032e+00, -2.45100e+00, -7.30235e-01, -4.24167e+00, -2.23239e+00], [-9.17969e-01, 8.47078e-02, -2.12049e+00, 1.03116e+00, -8.76690e-01, 3.90749e-01, 2.51558e+00, 5.40442e-01, 1.75232e+00, -9.01648e-01, 4.24933e-01, -2.63428e-01, -1.61619e-01, -5.89501e-01, -2.40157e-02, -1.22810e-01, 6.16192e-01, 3.37250e-01, 3.25961e+00, -5.22965e-01, 4.26105e-01, -4.88602e-01, 9.40004e-01, 1.65851e+00, -1.86509e-01, 5.02768e-01, -7.74956e-01, 1.99247e-01, 1.09851e+00, -2.94153e+00, -2.26482e+00, 1.73667e-01, 2.61898e-02, 1.35492e+00, -3.15955e-01, 1.87889e-01, -4.60919e-01, 5.54681e-01, -6.64728e-01, -8.14454e-01, 1.04256e+00, -4.94326e-01, 2.14867e-01, -1.21408e+00, 6.03943e-01, 2.96704e-01, -1.49902e-01, 1.34241e+00, 2.15626e+00, -4.30889e-01], [7.77168e-01, -2.34062e-01, 1.02646e+00, -5.04317e-01, -7.41322e-02, 2.80806e-01, 1.28575e+00, -5.51298e-01, 3.69624e-02, -1.52070e-01, 4.98744e-01, -1.67623e-01, -3.70710e-01, 3.21991e-01, -2.06554e-02, 1.15000e-01, -1.77516e+00, -5.58569e-01, -1.16711e+00, 8.22788e-01, -2.17501e-01, -4.38644e-01, 5.30474e-01, -3.56422e-01, 2.11024e-01, -8.32980e-01, 7.46199e-01, -4.92386e-02, 1.16415e-01, -1.82783e-01, 2.92439e-01, 5.73592e-01, -4.44169e-02, 3.07519e-01, -2.86002e-01, -3.50511e-02, -4.44172e-01, -1.04655e+00, -2.39716e+00, 2.98279e-01, 3.41572e-01, 9.49755e-01, 1.96726e-01, -6.66147e-01, 8.94599e-01, -8.34447e-01, 4.65065e-01, -4.11174e-01, 4.69671e-01, 2.13772e-01]] +[-1.91208e+00, 1.24605e+00, 2.85615e+00, -1.15820e+00, -3.26635e+00, -2.86894e+00, -3.22439e-01, -4.85852e+00, 8.26776e-03, 1.17866e+00, 1.70170e+00, 3.30882e-01, 3.35042e+00, -3.92805e+00, 6.51103e-01, 2.03860e+00, 1.22427e-01, -7.05198e-01, 1.25526e+00, -7.93870e-01, -4.51509e-02, -4.78274e-01, -1.86057e+00, 2.50165e+00, -2.96544e+00, -5.68930e-01, -1.48409e+00, -9.48268e-01, -7.17663e-01, 2.72495e-01, 8.96238e-01, 3.00529e+00, 3.28613e-01, -6.35325e-01, -4.05874e+00, 5.27279e-01, -1.07087e+00, 7.36461e-02, 2.60485e-01, 5.58703e-01, 1.78388e-01, -2.48131e+00, -3.99228e+00, 4.48551e-01, -1.18497e+00, 3.77234e+00, 2.01198e+00, 1.15044e+00, -4.28300e+00, -1.93304e+00, ] +ReLU +[[1.23855e-01, -2.99898e-02, -3.43471e-02, 2.35682e-01, 5.16264e-02, 1.85534e-01, 1.70525e-01, 2.16846e-01, -9.63596e-02, 2.99463e-01, -2.27108e-01, 2.58500e-02, -1.08711e-01, -2.65335e-02, 3.88110e-02, 3.18146e-02, 3.29355e-02, 1.25123e-01, -2.10173e-01, -7.03912e-02, 2.40042e-01, 3.07059e-01, 1.52678e-01, 1.08625e-01, 1.70332e-01, 1.36256e-01, -5.05293e-02, 7.26599e-02, -8.20902e-02, -4.19387e-02, -1.42813e-01, 9.55707e-02, -4.87213e-02, 9.21361e-02, 1.14147e-01, 1.64740e-01, 1.30736e-01, 8.03449e-02, 8.92799e-02, 1.51044e-01, -4.94331e-02, 9.08337e-02, 1.34777e-01, -6.03749e-02, 2.72577e-01, -4.81289e-02, 8.32008e-03, -4.35336e-02, 3.63770e-02, 3.35354e-01], [6.16140e-01, -7.97987e-01, -1.09004e+00, 2.18984e-02, -1.09811e+00, -7.66449e-01, 3.35419e-01, -4.25939e-01, -2.17134e+00, 4.35060e-01, -2.09932e-01, 7.47698e-01, -1.40255e+00, -4.99395e-01, -4.70160e-02, -3.79943e-01, -9.52955e-01, 3.72594e-02, -1.45053e+00, 4.03876e-02, -1.49615e+00, -6.32566e-01, -2.20298e+00, -2.06958e-01, -2.67970e+00, -2.67313e-01, -1.89527e-01, -3.12031e+00, -4.51579e-01, -5.21363e-01, -1.98168e+00, 3.89472e-02, -1.52495e+00, -4.03540e+00, -2.12557e-02, -1.90009e-01, 7.26604e-01, -1.00266e-02, -4.58588e-01, 7.38878e-01, 2.67263e-01, -1.41666e-01, -6.02411e-01, 3.39195e-01, 3.10546e-01, -3.10034e+00, -2.55406e-01, -5.23785e-01, -5.82378e-01, -1.08207e+00], [-9.34463e-01, -4.03846e+00, -4.58639e-01, -1.45574e+00, 4.56041e-01, -1.48681e+00, 8.62829e-02, -2.35135e+00, -5.86816e-01, -1.88039e+00, -5.73976e-01, -2.26615e+00, -9.61180e-01, -1.61130e+00, 5.55589e-01, -7.55494e-01, -3.56826e+00, 4.64808e-01, -1.68389e+00, -1.67430e-01, -9.94604e-01, -2.23342e+00, -2.71189e+00, -2.43534e-01, -6.98178e+00, -1.96415e+00, -1.07585e+00, 1.19288e-01, -2.49400e+00, -5.42128e-01, -4.61299e-01, 1.08704e+00, -2.43545e+00, -4.08066e+00, -1.13700e+00, 4.55688e-01, -3.05506e+00, -8.45067e+00, -2.59293e+00, -1.67217e+00, -4.69064e+00, -6.72884e-01, -2.54958e+00, 7.02966e-02, -2.06878e+00, -2.23859e-01, -3.00218e+00, -1.82151e+00, 6.24297e-01, -8.00313e+00], [-1.10956e+00, 9.16141e-02, -1.49345e+00, -2.77879e+00, -2.47462e+00, -6.07646e-01, -3.62145e+00, 9.61319e-01, -9.73282e-01, 2.41156e+00, -9.03897e-01, -2.68801e-01, -9.91120e-01, 8.21154e-01, 1.12307e+00, -4.04002e-01, 2.63177e-01, -8.65671e-02, -1.72337e+00, -3.30745e-01, -4.30018e+00, 6.27872e-01, -9.30876e-02, 8.57516e-01, -1.89311e+00, 2.08059e-01, -3.53951e-01, -3.56949e-01, -6.93132e-01, -2.00537e-02, -1.39159e+00, -3.59500e-01, -4.09311e-01, -3.03225e-01, -5.28270e-02, -6.67749e-01, -7.13786e-01, -3.17594e-01, -1.13827e+00, -3.64754e-01, 1.74242e+00, 1.04794e+00, 8.17433e-01, -3.31431e-01, -2.47077e-01, 4.68902e-02, 3.85175e-01, -1.85361e+00, 1.87862e+00, 3.99941e-01], [-1.40615e-01, -3.28776e-02, 6.19580e-02, 2.70763e-01, -5.07667e-02, 2.64121e-01, -4.11212e-01, 1.03408e-01, 4.80876e-01, -3.56415e-01, 3.55590e-02, 1.77781e-01, 6.58863e-02, 9.65507e-02, -8.56782e-02, -3.20842e-02, -2.12609e-01, -4.08219e-01, 1.20666e-02, -8.20868e-02, 4.48643e-01, -2.27120e-01, -4.12404e-01, -3.66846e-01, -1.01447e-01, 2.37693e-01, -6.70232e-02, 7.20805e-02, -2.57865e-01, -1.90244e-01, 1.27186e-01, -2.80326e-01, -3.66733e-02, -4.74369e-01, -4.05002e-02, -2.48921e-01, 1.55782e-01, 2.55019e-01, 2.69962e-01, -3.01862e-01, 1.37765e-01, 1.10857e-01, 1.02678e-01, -1.96265e-01, -3.17240e-01, -1.18766e-01, -3.48961e-01, -1.06819e-01, 1.03440e-01, 2.10910e-01], [1.54575e-02, -1.52747e-02, 6.24913e-02, -1.03611e-01, -7.83141e-02, 1.32692e-01, 5.82717e-03, 2.43111e-02, 2.57991e-01, -4.11787e-01, 2.54967e-02, -1.71378e-03, 3.62288e-02, 1.16387e-01, 4.82657e-02, -1.51013e-01, -6.42637e-01, 1.17478e-01, -1.44038e-02, -5.05639e-02, 2.72193e-01, 2.73754e-02, -7.22237e-02, -1.45765e-01, 1.49211e-01, 2.29366e-01, -6.83848e-02, 1.71732e-01, 4.38960e-02, -4.68250e-02, 4.70827e-02, -6.53217e-03, 2.08570e-02, -6.41873e-01, -1.96692e-01, -1.22191e-02, 5.82709e-02, 2.00497e-01, 1.22713e-01, -6.11927e-02, -2.66303e-02, 4.38350e-02, 1.01869e-02, -5.69911e-02, -5.86743e-02, -5.30150e-02, 1.38388e-01, -7.20266e-02, 2.97581e-01, 4.95951e-01], [-5.02909e+00, -9.89580e-01, 2.69059e-01, -5.21249e-01, 6.81836e-01, -4.27305e+00, -2.85533e+00, -1.25622e+00, -1.63860e+00, -8.03968e-01, -2.28979e+00, -4.95440e+00, 2.42235e-01, -3.27745e+00, 7.89089e-02, 5.98503e-01, 1.89992e-01, -9.51254e-01, -3.33969e+00, -4.38018e-01, -1.02992e+00, -1.32950e+00, -1.98970e+00, -3.13803e+00, -5.22388e+00, -6.12689e+00, -8.11725e-02, -2.46976e+00, -3.15536e+00, 2.62764e-01, 1.23873e-01, 1.69760e-01, -5.96350e-01, 8.97965e-02, -6.70979e-01, -1.98535e+00, -1.70046e+00, -3.84677e+00, -1.63397e+00, 1.11962e-01, -1.80311e+00, -9.52315e-01, -3.88548e+00, -2.89611e+00, -2.95107e-01, -7.38226e-01, -4.04246e+00, -8.39595e-01, -2.98333e+00, -2.29786e-01], [1.39933e+00, 1.67974e-01, -2.42988e+00, -3.38738e+00, -6.63441e-01, 3.79458e-01, 2.08861e-01, -1.87223e-01, 2.77580e+00, 2.63182e+00, -4.03373e-01, -1.36044e+00, -1.69462e-01, -8.68590e-01, 3.88585e-02, 3.44169e-01, 1.63777e+00, -1.64412e+00, 1.07976e-01, -4.28382e-01, -4.55550e-01, 2.60569e-01, -1.22639e+00, -1.83393e-01, 2.39393e-01, 4.50696e-01, -4.02545e-01, -1.11242e+00, 1.04963e-01, 7.92025e-01, -1.78648e+00, -5.95214e-01, -5.48635e-01, 1.36365e+00, -5.50493e-02, 6.34473e-01, -2.15470e-01, 7.44904e-01, -4.56902e-02, -5.84649e-01, 1.58702e+00, 2.42047e-01, -2.59918e+00, 5.22815e-01, 1.93843e+00, 3.19371e-02, 7.24946e-01, -1.19980e+00, 1.79568e-02, 7.71090e-01], [-7.35681e-01, -8.17294e-02, -3.39344e+00, -2.80112e+00, 5.96875e-02, 4.93505e-02, 7.44418e-01, 5.52134e-01, -1.99074e+00, 1.51213e-01, 4.09465e-01, 1.24720e+00, -6.08534e-01, 2.20609e-01, -8.28447e-01, 2.47813e-01, 6.86239e-01, 2.84436e+00, -4.36828e-01, -5.42980e-01, 6.18084e-01, 1.85774e+00, -1.89675e+00, 1.56442e+00, 6.21696e-01, -7.63332e-01, -4.62543e-01, -1.09334e+00, 4.15040e-01, 2.83012e-01, -4.37685e-01, -1.25647e+00, 1.20819e+00, 9.40396e-01, -3.66861e-01, -1.05676e+00, -3.95159e-01, 8.68606e-01, -2.96324e-01, 2.59246e+00, 7.90445e-02, -4.13737e-01, -1.74461e+00, -1.92045e+00, 4.57504e-01, 1.59854e-01, 1.63910e+00, 3.69059e-01, -3.41789e+00, 9.50766e-01], [-1.47340e+00, -2.10820e+00, 4.79122e-01, -2.73913e+00, -5.50605e-01, -2.15369e+00, -3.79238e+00, -2.42689e+00, -3.11814e+00, -2.39709e+00, -8.62710e-01, -3.08331e+00, -4.32933e-01, -9.89636e-01, -1.68806e-01, -9.59634e-01, -1.19366e+00, -1.36654e+00, -1.48686e+00, 1.20901e-02, -6.74713e+00, 1.97485e+00, -1.63113e+00, -1.97981e+00, -1.05635e+00, -5.64236e+00, -1.14103e+00, 2.50733e-02, -1.58380e+00, -7.74680e-01, -2.37041e-01, -1.99847e+00, -2.41613e+00, 3.41701e-01, 7.89058e-03, -2.28240e+00, -6.23845e+00, -7.46668e-01, -4.26020e+00, -2.13916e+00, -4.51586e+00, -6.48841e-01, -4.72207e+00, -3.10754e+00, 9.54605e-01, 3.82234e-01, -2.40856e+00, -1.54939e-01, -3.17716e+00, -3.53253e+00], [1.19011e+00, 5.90454e-01, -3.60044e-02, -1.83487e+00, -1.75792e+00, 8.88361e-02, -1.32793e+00, 1.00849e+00, -1.48311e+00, -7.13676e-01, -1.76058e-01, -1.01303e+00, 1.85616e-01, 2.43259e-01, -6.17502e-01, 3.61806e-02, 4.15412e-01, -4.45810e+00, -8.43405e-01, -2.25210e-01, -1.47440e+00, 8.36451e-01, -1.79314e+00, -2.35540e+00, 1.55933e+00, -1.03989e+00, -6.19316e-01, -1.67509e+00, 4.39183e-01, 9.94543e-01, 1.13217e+00, 7.42705e-01, 6.05456e-01, -1.85380e+00, 1.05934e+00, 1.09273e+00, -4.09579e-02, -6.90519e+00, 2.80031e-01, -8.14390e-01, -3.86729e+00, 3.39605e-01, -1.54998e-01, 1.48012e+00, 1.08635e+00, -6.73255e-01, -3.71111e+00, -8.48002e-01, 1.94538e+00, 1.11533e+00], [2.13872e+00, -3.84015e-01, 3.25716e-02, 2.31035e+00, -7.29838e-01, -2.75328e+00, 2.80755e+00, -2.00911e+00, 1.32903e+00, -9.93704e-01, -7.67347e-01, 1.02128e-01, -4.08152e-01, -3.19932e-01, 1.62525e-01, -1.38838e+00, 1.08314e+00, -1.29641e+00, -7.54968e-01, -6.17968e-01, -1.48606e+00, 2.84665e+00, 1.33883e-01, -8.67376e+00, -2.44669e+00, 1.25165e+00, -7.00737e-01, -9.17775e-01, -5.83220e-01, 1.18340e+00, 7.43588e-01, -7.25866e-01, 7.79331e-01, -1.09989e+00, -1.04865e-01, -1.00039e+00, 9.44027e-01, 2.62844e-01, 1.67502e-01, -3.78278e+00, 3.55271e+00, 4.14495e-01, -6.75597e+00, 7.77288e-01, 1.79130e+00, 8.37843e-01, -6.47756e-01, 3.18228e-01, 2.43648e+00, -1.19108e+00], [-8.23200e-03, 1.02005e-02, -4.91271e-04, 1.63872e-02, -4.64230e-04, -2.43430e-04, -1.14420e-02, -8.88560e-04, -3.15238e-02, -1.48140e-03, -4.85177e-03, -5.24565e-03, -2.99341e-04, 3.97091e-03, 2.52533e-03, 1.37232e-03, 1.72572e-02, -6.49726e-03, -4.40878e-03, -1.63478e-03, -1.60654e-02, 7.89176e-03, 4.21242e-03, -1.56359e-04, -1.40977e-02, 7.31280e-03, -8.50152e-03, -1.29864e-03, 1.25812e-02, -9.65884e-03, 7.58420e-03, 2.92663e-03, -3.35454e-03, 6.11963e-03, -3.21971e-02, -8.78945e-03, 3.69690e-03, 4.00711e-03, 1.73491e-02, 1.73675e-03, -1.02444e-02, -3.60791e-04, 6.23659e-04, 7.49963e-03, 6.69804e-02, -2.59695e-03, 1.80108e-02, 1.16206e-03, 1.30094e-02, 2.04745e-02], [1.44718e-02, 3.95863e-02, -4.08428e-02, -5.39772e-02, -2.24474e-02, -9.19334e-03, 5.09164e-02, -4.37454e+00, 1.98850e-03, 4.51722e-02, -1.79186e-03, -4.30613e-02, -1.48658e-02, -1.37742e-02, 4.25592e-02, 7.63691e-02, 3.67586e-02, -3.00086e-01, -3.04270e-02, -3.88336e-02, -1.50596e-01, 5.95673e-02, -2.83566e-01, -7.23009e-03, 2.62911e-02, -1.13401e+00, -1.26844e-02, -1.57724e-02, 5.61185e-02, -3.92274e-02, 3.86983e-02, -1.98933e-02, -3.62112e-02, 1.45130e-02, -2.98890e-01, -1.40081e-01, -3.28733e-02, 1.22135e-02, 8.47181e-03, -4.76076e-02, -4.86345e-02, -9.72923e-03, 8.64738e-02, -9.20339e-03, 1.32111e-02, 2.21306e-02, 3.27418e-02, 2.02536e-02, 4.36326e-02, -1.55586e-01], [1.93804e+00, -9.98390e-01, 9.29792e-01, 1.61351e+00, -1.25553e-01, 1.31469e+00, 2.93056e+00, 4.82463e-01, 3.27390e+00, 6.02022e-01, -3.23280e+00, 9.69840e-01, -2.70663e-01, 1.91975e+00, -4.62132e-01, -1.27814e+00, -1.44374e+00, -2.30892e-01, -1.77393e+00, -5.11284e-01, -9.42343e-01, 3.93757e+00, 2.72292e+00, 9.20240e-01, 2.23997e+00, -9.24622e+00, 3.10164e-01, -2.63910e+00, -2.38181e-01, 1.23111e-01, 1.52197e+00, -1.52923e+00, 2.23003e-01, 2.96716e+00, -3.41990e-01, 2.06589e+00, 1.17191e+00, 8.71108e-01, 3.34127e-01, -9.13598e-01, -5.60981e-01, 1.21085e-01, -1.92850e+00, -5.84880e-01, 1.86641e-01, 1.58959e-01, 1.56364e+00, 1.37715e-01, -1.27220e+00, -7.40291e-01], [-2.81695e+00, 5.34768e-01, 6.05145e-01, -2.55135e+00, -2.68272e+00, -3.67892e+00, -2.74599e+00, -2.38647e+00, -6.82146e+00, -3.39706e+00, -1.22614e+00, -5.85597e+00, 3.84798e-01, -3.31984e+00, 4.80087e-01, -5.98358e-01, -4.43711e+00, -7.41357e-01, -6.62748e-01, 3.36928e-03, -4.84624e+00, -2.71565e+00, -4.66668e+00, -8.63483e-01, -3.74259e+00, -5.81940e+00, -1.48300e-01, -3.75223e+00, -3.56694e-01, -4.02983e+00, -3.89832e+00, -1.83038e+00, -6.79677e-01, -1.98476e+00, 1.98717e-01, -2.18875e+00, -4.12832e+00, -2.38986e+00, -3.09969e+00, -3.41521e+00, -4.49505e+00, -3.42201e+00, -1.73524e+00, -1.00939e+00, 2.52910e+00, -2.14494e+00, -4.11295e+00, -1.80831e-01, -2.14660e+00, -3.35088e+00], [-2.59384e-02, 2.67326e-03, 1.67733e-02, -3.95070e-02, -1.28416e-02, 7.40196e-02, -1.27460e-01, 8.70605e-02, 1.23428e-01, -1.39036e-01, 1.45428e-02, 6.58810e-02, 2.70765e-02, 1.42159e-02, -2.30461e-02, -1.60471e-02, -3.41077e-02, -1.21896e-01, -1.43922e-02, -2.37965e-02, 1.55666e-01, -3.26174e-02, -1.26704e-01, -1.17199e-01, -6.61259e-02, 4.52967e-02, -2.64141e-02, 1.29373e-02, -7.58754e-02, -7.99163e-02, 6.38692e-02, -8.05736e-02, -1.55055e-02, -9.55451e-02, -1.46018e-02, -7.63941e-02, 5.99858e-02, 7.52563e-02, 9.87899e-02, -6.59263e-02, 5.35416e-02, 6.47694e-02, 2.34577e-02, -5.03797e-02, -7.76849e-03, -4.44287e-02, -8.86129e-02, -2.49758e-02, -2.56339e-02, 3.09703e-02], [-8.24446e-01, -6.20743e-01, -1.01379e+00, -2.11605e-01, 2.92418e-01, 4.82903e-01, -4.66818e-01, 3.18788e-02, 1.11198e+00, 1.56028e+00, -5.37952e-01, 1.71249e-01, -1.40590e-01, -3.94777e-01, 6.99733e-01, -3.22590e-01, 9.25549e-01, 1.18512e+00, -1.83641e-01, -1.92774e-01, -1.60342e+00, 9.85216e-01, 1.23957e+00, -6.54109e-01, 1.39734e+00, 6.46059e-01, -1.07749e+00, -9.20645e-01, 1.19991e+00, 9.98409e-01, -4.21474e-01, 3.48574e-01, -5.93971e-01, 1.34097e+00, 1.45924e+00, 7.58108e-01, -1.96743e-01, -4.30695e-01, -1.27398e-01, 4.05991e-01, 2.29489e+00, 6.15182e-01, 7.53460e-01, 1.94317e-02, 1.67319e+00, -5.99303e-02, 5.91188e-01, -6.68012e-01, 7.89380e-01, 5.55970e-01], [-1.76322e+00, -2.59417e-01, -2.51320e+00, -1.02869e+00, -3.92956e-01, 3.70727e-01, -1.67115e+00, 1.16340e-01, 1.18350e-01, -8.05623e-01, -8.53358e-02, -3.11388e+00, 6.80274e-02, -2.38563e+00, -1.55036e-02, -1.07356e+00, -1.74342e+00, 7.94324e-01, -2.17101e-01, -1.22499e-01, 4.11452e-02, -1.44143e+00, -1.10551e+00, -6.73979e-01, 5.01717e-01, 1.63612e-01, -5.48823e-01, -1.09071e+00, -1.99207e+00, -1.22228e+00, -1.57103e-01, -5.03632e-01, -2.19095e-02, -1.69371e-01, -6.51218e-01, -3.01045e-01, -6.36067e-01, -2.97892e-01, -2.25893e+00, -1.75960e-01, -1.16086e+00, -1.34375e-01, 3.93996e-02, -1.20329e+00, -1.28677e+00, -1.84105e+00, -4.84152e-01, 1.25215e-01, -2.15950e-01, -1.75997e+00], [2.98541e+00, -8.17922e+00, 1.15685e+00, -3.05377e+00, 6.20563e-01, 1.92805e+00, 3.02256e+00, -8.72802e-01, -2.75597e+00, -4.33523e-01, -7.01153e-01, 3.11463e+00, -2.86466e-02, -7.56154e+00, -4.56311e-01, 1.77776e-01, 3.20916e+00, 2.78393e+00, -1.86200e+00, -8.78533e-01, -4.84300e-01, 2.77481e+00, 1.49679e-01, -5.53926e+00, 1.76534e+00, -5.08115e-02, -1.01528e+00, 2.46825e+00, -3.68445e-01, -6.07801e-02, -2.55077e+00, -1.60385e+00, 4.24505e-02, 1.71635e+00, 2.50741e+00, -4.30500e+00, 2.64778e+00, -6.96790e+00, -4.19679e-02, 1.47095e+00, 3.77165e-01, -5.58753e+00, 2.28441e+00, 1.05942e-01, 1.05187e+00, -5.21958e-01, -6.01079e+00, 4.28003e-01, 3.00871e-01, 3.37724e+00], [-6.39215e+00, -5.34794e-01, -3.12649e+00, -4.73943e+00, -3.90292e+00, -2.20737e+00, -1.91027e+00, -3.04716e+00, -2.79103e+00, -1.47212e+00, -3.09167e-01, -3.88164e+00, 2.70895e-01, -6.68501e-01, -6.50093e+00, -2.94855e+00, -3.95406e+00, -2.74165e+00, -5.23941e+00, 4.92842e-01, -8.81776e-01, -6.23009e-01, -3.07888e+00, -2.00355e+00, -1.09997e+00, -7.80042e+00, -2.50223e+00, -2.45823e+00, -4.56116e+00, -2.89274e+00, -7.58004e+00, -4.48067e+00, -1.70246e+00, -1.45713e+00, 8.14941e-02, -1.75325e-01, -2.62860e+00, -1.32863e+00, -3.39546e+00, -3.28544e-01, -3.61383e+00, -4.16549e+00, -5.20339e-01, -8.47081e-01, -1.97896e+00, -1.93057e+00, -1.17019e+00, -3.85913e+00, -3.88296e+00, -2.51084e+00], [1.18870e-02, 5.86817e-01, -2.17579e+00, -2.74331e-01, -5.19773e-01, -1.74154e+00, -3.83064e+00, -9.85378e-02, -2.03023e+00, -8.53486e-01, -8.03785e-01, -2.44796e+00, -3.98383e-01, -1.79389e+00, 2.56170e-01, -6.87253e-01, -1.21694e+00, -1.13360e+00, -1.50869e+00, 7.29678e-03, 1.59144e-01, -1.40342e-01, -1.54920e+00, -1.33863e+00, -2.64572e+00, -5.15753e-01, -2.02563e+00, -2.76681e-01, 9.09275e-02, -1.38082e+00, -3.93580e+00, -2.99448e-02, 3.83969e-02, -1.62912e-01, 1.52265e-01, -4.01957e-01, -4.72615e-01, -2.37688e+00, -1.82119e+00, -4.86659e-01, -1.74843e+00, -2.43208e+00, -2.28668e+00, -3.00778e+00, 2.60346e-01, 2.59511e-01, 8.10853e-01, -2.73181e+00, -2.28776e-01, -2.25873e+00], [-5.86893e-01, -6.62266e-01, 2.18161e-01, -3.26707e-01, -1.92832e+00, -3.40166e-01, 6.85792e-01, -8.29291e+00, -2.25937e+00, 1.02467e+00, -8.20959e-02, 1.23253e+00, -1.12866e-01, 1.09718e-01, 2.29751e-01, -2.55924e-01, -1.78580e-01, -9.96544e-01, -6.95572e-01, -2.69442e-01, 9.59198e-01, 1.21521e+00, 1.28105e+00, -6.42518e-01, 4.75909e-01, -6.66198e-01, -6.59407e-01, 2.20803e-01, 1.28305e+00, 7.41657e-01, 1.20170e-01, 8.43605e-01, -2.41190e-01, 1.42111e+00, -2.96228e-01, 9.01268e-01, 8.75735e-01, 1.46966e-01, -1.10736e-01, 9.75672e-01, 1.34887e+00, -2.32133e-02, 2.08304e-01, 5.43885e-01, 4.94523e-01, 9.79934e-02, -2.69733e-01, -3.09666e-02, 1.37890e+00, 4.53814e-01], [-2.46708e+00, -1.51239e+00, -3.28430e+00, 2.71078e-01, -3.69291e+00, 9.06318e-01, -2.37675e+00, -1.44245e+00, -2.85960e+00, -2.49811e-02, -1.20054e+00, -2.34752e+00, -1.91908e+00, -1.58696e+00, -1.85005e-01, -1.31164e+00, -2.03663e+00, -9.21021e-01, -1.40022e+00, 5.31655e-01, -2.02270e+00, -2.62013e+00, -4.54374e+00, -1.54654e-01, -3.73561e+00, -2.03811e+00, -1.01812e+00, -2.60819e+00, -4.65968e+00, -2.22845e+00, -8.39088e-01, -3.11362e-02, -2.20656e+00, -1.88711e+00, -5.39101e-02, -1.16176e+00, -4.40178e+00, -1.29652e+00, -5.34218e+00, -5.99998e-02, -9.37584e-02, 3.66187e-01, -7.42022e-01, -2.18683e+00, -1.28034e+00, -4.21321e+00, -4.70356e-01, -1.04636e-02, -3.25100e+00, -3.07826e+00], [1.77761e+00, -1.27535e+00, -1.08207e+00, -1.52974e+00, -2.52911e+00, 1.03315e+00, 1.29098e+00, 2.71638e+00, 1.53925e+00, 4.42561e-02, -1.11059e+00, 2.28802e+00, 7.94977e-01, -3.93343e+00, -1.28544e+00, -9.27755e-01, 1.49343e+00, 5.47050e+00, -1.72485e+00, -9.43452e-01, 1.30970e+00, -8.96527e-04, -3.33294e+00, -7.79147e+00, 3.47206e+00, 4.10191e-01, -7.79515e-01, -1.57531e+00, 3.98857e-01, 1.83841e-01, -3.20137e-01, 2.43451e+00, 1.87832e+00, -3.49578e+00, 1.95114e+00, 3.50550e+00, 7.27706e-01, 7.00413e-01, -3.03031e-01, 3.36818e+00, 6.30810e-01, -3.33994e-01, -3.45386e+00, -1.67624e+00, -1.19754e+00, -1.13824e+00, -1.32830e+00, 1.28834e+00, 1.86728e+00, -1.96468e+00], [-7.39969e-01, -6.90171e-01, 1.08514e+00, 3.74185e+00, 3.13316e-01, 1.20598e+00, 2.80386e+00, -2.45945e+00, 8.86185e-02, 8.73349e-01, -1.47810e+00, 2.13233e+00, 3.48698e-01, -2.85366e+00, 6.04352e-01, -1.74184e+00, 8.04147e-01, -1.27236e+00, -1.04174e+00, -6.54142e-01, 1.87187e+00, -1.36998e+00, 2.93445e+00, -8.25619e-01, 3.52094e-01, 5.87011e-01, -6.76909e-01, 8.40845e-01, 6.64216e-01, -4.59276e+00, -3.56052e+00, 1.99885e+00, 3.21056e-01, 4.56836e-01, 1.04028e+00, 1.73491e+00, -1.13072e-01, 7.67226e-01, -2.64970e+00, -9.53816e-02, -1.65298e+00, 1.27316e+00, -1.06131e+00, -6.60829e-01, 8.94776e-01, 2.23701e-01, 7.60135e-01, 3.23877e-01, -4.70838e+00, -1.13987e+00], [5.01420e-02, -2.99257e-02, 7.57747e-01, 1.46652e+00, 8.37088e-01, -5.53743e-01, 1.04019e+00, 3.38693e-01, 1.21979e+00, -5.11425e+00, -1.34939e+00, -4.40809e-02, -1.17409e+00, -7.76334e+00, -9.56609e-02, 1.84295e-01, 2.57637e+00, 2.92823e+00, -3.50456e-01, -4.15024e-01, 1.78165e+00, -3.57058e+00, -2.39416e+00, -1.26066e+00, 2.03099e+00, 6.15384e-01, -4.28714e-01, 1.93804e+00, 1.09159e-01, -2.63618e+00, -6.46316e-01, -3.61635e+00, -1.64440e+00, 2.05302e+00, 1.83624e+00, 9.84708e-01, -1.67594e+00, 1.11355e+00, -1.35068e+00, 4.64220e-01, 2.53241e+00, -9.83734e-02, -5.78669e+00, 8.77703e-01, -5.84591e+00, -2.97311e+00, -2.70438e-01, -3.38013e-01, 2.34593e+00, 4.51819e+00], [2.86102e+00, -5.18256e-01, -2.66328e-01, 2.01746e-01, 5.63855e-01, 6.70571e-01, 3.42515e+00, -1.86733e+00, -2.94500e-02, -3.60721e-01, 1.09200e-01, 7.82803e-02, -3.35272e-01, -2.14673e+00, -4.96913e-01, 1.46798e+00, 1.17827e+00, 5.04894e-01, -2.67919e-01, -1.49599e+00, -5.41706e-01, 4.74848e-02, -1.82162e+00, -2.17574e+00, -2.16252e+00, -2.21051e+00, -3.37448e-01, 1.76272e-01, -1.44801e+00, 1.63844e+00, -3.15889e+00, 4.97116e-01, -1.66359e+00, 2.51599e+00, -7.52953e-02, -2.54216e+00, -6.26471e-01, -6.15070e-02, -2.20771e+00, -1.17878e+00, 5.61859e-01, 1.66601e-01, -5.15973e+00, 2.48368e+00, 1.86342e+00, 7.35895e-01, -3.54690e+00, -2.05353e-01, -3.88035e+00, -2.68519e+00], [-6.58627e+00, -8.11558e-01, 4.75354e-01, -3.58222e+00, -5.80195e+00, -4.90931e+00, -2.47532e+00, -9.32831e-01, -4.37215e+00, -4.34914e+00, -5.66609e-01, -4.85942e+00, 5.11530e-01, -1.19623e+00, -2.06052e+00, -2.09013e+00, -5.85766e+00, -4.22915e+00, -3.93081e+00, 3.80134e-01, -1.24483e+00, -6.95410e+00, -8.23188e+00, -2.68650e+00, -6.77704e+00, -4.27332e-01, -3.82739e+00, -2.54417e+00, -2.44159e+00, -1.52530e+00, -4.04386e+00, -1.19600e+00, -2.02416e+00, -5.90104e-01, -1.04338e+00, -1.51553e+00, -1.58556e+00, -8.20572e-01, -4.57655e+00, -1.16858e+00, -1.46294e+00, -9.67336e-01, -1.16822e+00, -3.49909e-01, -1.95096e+00, -6.96475e+00, -4.02993e+00, -7.88084e+00, -4.21649e+00, 1.79933e+00], [2.42959e-01, 3.48560e-01, -1.07911e-01, -1.63023e+00, -9.62177e-01, 2.12912e-01, 9.96044e-01, -1.78717e-01, 7.38017e-01, 1.55297e-01, 5.51012e-02, 6.55112e-01, -9.33859e-01, -2.48371e+00, 8.97145e-01, -3.60953e-01, -5.82419e-01, 1.99180e-01, -8.46053e-01, -1.72077e-01, -1.53236e+00, -4.42260e-01, 2.27533e+00, 5.89483e-01, 1.72200e+00, -2.61326e-01, -3.26788e-01, 5.63524e-01, -7.15737e-02, -3.38461e-01, -4.31436e-02, 9.83100e-01, -5.92421e-03, 4.65159e-01, 6.06516e-01, -2.88004e-01, -7.00486e-03, -2.29705e-01, -2.06926e-01, 1.21376e+00, 1.55450e+00, -6.03813e-02, -1.67227e-01, -1.35932e-02, 1.52188e+00, -3.43412e-01, 1.09596e-01, -1.09901e-01, 1.51384e+00, 3.06463e+00], [1.86320e+00, 1.74382e-01, -3.67329e-01, 3.72990e+00, 6.38924e-01, 2.28344e+00, 2.09358e+00, 2.84598e+00, -2.74102e+00, 1.42264e+00, -2.36035e+00, 1.31913e+00, -8.21134e-01, -1.08384e+00, 5.23426e-01, 8.47199e-01, -1.84272e+00, 2.23651e+00, -3.09534e+00, -8.57394e-01, 2.22834e+00, 3.15432e+00, 1.79153e+00, -3.67296e-01, 1.85205e+00, 2.58528e+00, -1.10785e+00, 1.19690e+00, -1.83167e+00, 4.09855e-01, -2.00099e+00, 1.82656e+00, -1.20488e+00, 1.56321e+00, 2.22662e+00, 1.85793e+00, 1.78940e+00, 1.09761e+00, 1.15990e+00, 2.07665e+00, -1.30354e+00, 1.48882e+00, 7.08311e-01, -9.08334e-01, -3.59846e+00, -5.60791e-01, -1.01120e+00, -1.03226e-01, -7.27633e-01, 2.26813e+00], [-3.67911e-02, -3.54007e-01, -5.19689e-02, -4.28502e+00, 1.14659e-01, 8.43030e-01, 1.85574e+00, 1.65963e+00, -1.91356e+00, 1.25278e+00, -2.30781e+00, 8.98261e-01, 4.33188e-01, -7.93611e+00, 3.95877e-01, 8.64505e-01, 1.28905e+00, 1.11818e+00, -1.58533e+00, -6.26222e-01, 1.05197e+00, -8.85984e-01, 1.33190e+00, -6.97512e+00, 2.62025e+00, 2.26583e+00, -6.19665e-01, 2.24318e+00, -3.65284e-01, 1.52872e+00, -1.74682e-01, -1.28499e+00, 1.17100e-01, 7.72524e-01, -9.02694e-01, -6.49524e-01, 2.63822e+00, -3.81866e-01, 5.72552e-01, 9.56299e-01, 6.92032e-01, -2.72923e+00, 1.93743e+00, -5.00500e-01, -1.93588e+00, -2.99985e+00, 7.61837e-01, 6.65068e-02, -4.97518e+00, 1.17555e+00], [-5.03050e-01, -4.30079e-01, -1.35284e-01, -1.00481e+00, -1.52804e+00, 7.22368e-02, 4.63072e-01, 2.26635e-01, -8.14755e-01, -6.16295e-01, -3.49828e-01, -1.09436e+00, -3.34120e-01, -3.59153e-01, -2.20861e-01, -6.95493e-01, -3.61368e-03, -2.66055e-01, -3.56735e-01, -1.19859e-01, -1.21985e+00, -1.04677e+00, 1.14250e-01, -8.72374e-01, 5.34896e-01, -1.68332e+00, -4.87498e-02, 1.53201e-01, 4.72207e-01, -8.60271e-02, -1.20480e+00, 5.01026e-01, -1.16478e-01, 6.28293e-01, -1.84467e-02, 2.79821e-01, -2.01073e+00, -5.58117e-01, -5.74840e-01, 3.74409e-03, -1.05805e+00, 2.19627e-01, 8.12458e-01, -6.90617e-01, 7.99513e-01, -2.55888e-01, -2.11555e-01, -5.36320e-02, 4.59916e-01, -1.43338e+00], [-2.05859e-01, -4.18565e-02, 1.22471e-01, 3.03006e-01, -1.18691e-01, 4.26698e-01, -6.21060e-01, 1.72666e-01, 7.92819e-01, -7.17118e-01, 5.41005e-02, 2.63574e-01, 1.22783e-01, 1.77415e-01, -1.10401e-01, -1.36600e-01, -4.85199e-01, -6.42662e-01, 4.77081e-03, -1.34316e-01, 7.99827e-01, -2.76537e-01, -7.00057e-01, -6.03030e-01, -1.19286e-01, 4.25319e-01, -1.66047e-01, 1.65765e-01, -3.78762e-01, -3.40149e-01, 2.09934e-01, -4.34570e-01, -4.36820e-02, -8.96385e-01, 1.27720e-01, -3.96048e-01, 2.60414e-01, 4.55954e-01, 4.40290e-01, -4.65679e-01, 2.13628e-01, 1.94283e-01, 1.35778e-01, -3.13002e-01, -4.54000e-01, -2.31641e-01, -5.11471e-01, -2.11233e-01, 2.29336e-01, 4.86809e-01], [-1.44812e+00, 3.13363e-01, 7.96096e-02, -7.52810e-01, -3.75001e-01, -8.42602e-01, 3.98994e-01, -2.18556e+00, 5.31107e-02, -1.77539e-01, 8.92416e-02, -9.71759e-01, 6.51394e-02, -9.31551e-01, -5.34471e-01, -2.38286e-01, 2.55986e-01, 6.62466e-01, -1.02137e-01, -8.58711e-02, 3.20878e-01, 5.69439e-01, 1.53408e-01, 2.01878e-01, 3.79435e-02, 2.15190e-01, -2.51745e-02, 6.54918e-02, 3.14641e-01, -1.20530e-01, 3.58997e-01, -6.51408e-01, 5.44670e-02, -3.99277e-01, 3.35746e-01, 3.21576e-01, 5.30227e-01, -2.58979e-01, 3.24774e-02, 5.41102e-01, 1.34164e-01, 6.79465e-02, 3.51787e-01, 1.47225e-01, 5.69647e-01, -1.00550e-02, 6.51260e-01, -3.23956e-01, 4.55788e-01, 5.34918e-01], [1.39368e+00, -1.48287e-01, -1.04186e+00, -2.68067e-01, 4.26552e-01, -1.46703e-01, 2.04829e+00, -4.14128e+00, 5.24142e-01, 1.66133e-01, -9.90885e-01, 3.87938e-01, -2.42727e+00, -8.21023e-01, -3.10643e-01, 4.19701e-01, -1.09752e+00, -1.29494e-01, -4.71537e-01, -3.92923e-01, 3.07398e+00, -7.06222e-01, 3.13216e+00, 1.07160e-01, 1.98558e+00, -1.55486e+00, -2.06412e-01, 1.10381e-01, 8.74480e-01, 2.59204e-02, 1.36278e+00, -1.40317e+00, -2.56755e+00, 2.27005e+00, 1.71332e+00, -1.06232e+00, 6.17659e-01, -1.08127e+00, 2.93972e-02, -3.59200e-01, 8.76547e-01, -4.43167e-01, 1.74025e+00, 2.88323e-01, 2.81041e+00, -1.22097e+00, 5.06420e-01, -6.23314e-01, 9.13645e-01, 5.13821e-01], [-1.67565e-02, 1.25060e-02, -2.60180e-02, 6.52435e-02, -1.69050e-01, -1.37282e+00, -7.33164e-01, -2.03137e-02, -6.22079e-02, 9.80321e-02, 6.64581e-04, -3.40789e-02, -2.93209e-02, 4.00842e-02, 1.64088e-02, -2.07216e-01, -7.57579e-01, -1.39189e-02, -2.57730e-02, -4.21379e-03, -1.10694e-01, -8.52534e-02, -1.08938e+00, 3.73712e-02, -1.65831e+00, -6.33385e-02, -8.37163e-02, -2.26727e-02, -1.74681e-02, 2.55556e-02, 6.24365e-02, -7.98741e-03, -1.52246e-02, -7.42464e-01, 4.67466e-02, -1.27130e-02, -6.43001e-01, -1.00867e-02, 6.26655e-02, -1.59089e-01, 9.75251e-03, 2.37200e-02, 2.21890e-02, -1.44247e+00, 7.34290e-02, 1.90104e-02, 9.95319e-03, -1.50713e-01, -4.65323e-02, -2.69819e-02], [-1.85944e+00, 7.52150e-01, -1.90647e+00, -1.19358e+00, -3.53591e-01, 2.00318e-01, 1.48041e+00, 1.05942e+00, 4.02423e-01, 4.55965e-01, 4.71768e-01, -6.04124e-01, -2.89392e-01, 9.74841e-02, 5.55328e-01, -5.72893e-01, 3.64084e-01, -2.10301e+00, -5.74120e-01, -8.16511e-02, -1.12829e+00, 1.35481e+00, -3.54696e+00, 2.13388e-01, 1.57811e+00, -2.13405e+00, -1.05439e+00, 1.41608e-02, -3.79501e-02, 9.18097e-01, -3.10433e+00, -6.99612e-01, 4.84393e-02, 2.37178e-01, -2.44676e+00, 1.30385e+00, 8.52895e-01, -5.80571e-01, -8.34547e-01, 1.05305e+00, 2.00881e+00, 4.88395e-01, -3.47772e+00, 1.21459e+00, 1.25891e+00, -2.06171e-01, 1.43099e-01, -6.84983e-01, -6.02303e-01, 2.09374e+00], [2.92154e-01, -5.20622e-01, 3.90377e-01, -1.66713e+00, -4.17590e+00, -3.21770e+00, -1.32188e+00, -1.06724e+00, 2.89618e-01, -8.97842e-01, -1.07301e+00, -5.27451e+00, -3.95676e+00, -1.92929e+00, 1.41720e-01, -1.80090e+00, -9.34513e-01, -3.65421e+00, -3.98995e+00, -2.66956e-01, 8.15679e-02, -2.84339e+00, -2.68615e+00, -1.48500e+00, -5.44982e+00, -4.61190e+00, 2.44597e-01, -8.01340e-01, 1.10065e-01, 2.02636e-01, 5.56341e-01, -7.89333e-01, 2.88758e-01, -2.46918e+00, -9.01804e-02, -1.94078e+00, -1.35166e+00, -1.72368e+00, -3.71057e+00, -7.07733e-01, -3.70695e-02, -2.63403e+00, -3.34522e+00, -1.01550e+00, -1.47282e+00, -8.15471e-01, -4.21213e+00, -2.17851e+00, -2.69082e+00, 4.22831e-01], [3.12241e+00, -2.80141e-02, 1.07345e+00, -4.95208e+00, -9.54040e-02, -4.57814e+00, 2.59433e+00, -2.52264e-01, 1.09019e+00, 3.17240e+00, 3.33480e-01, -1.09497e+00, -3.46278e-01, 8.05853e-01, 2.71298e-01, -1.36594e+00, 1.70019e+00, 2.97804e+00, -6.07242e-01, -7.45473e-01, 9.82313e-01, 1.97543e-02, -5.49772e-01, -6.69453e+00, 8.66543e-01, 1.10497e+00, 4.30970e-01, 2.39731e-01, 1.07127e+00, -1.39723e+00, -3.16656e-01, 2.44322e+00, 4.41806e-01, -1.02331e+00, 1.75814e+00, 1.65733e+00, 5.23218e-01, 1.40413e+00, -1.76516e+00, -7.80199e-01, 4.26961e+00, 1.59647e+00, -3.18110e+00, -1.79525e+00, -2.00008e+00, -1.51455e-01, 1.81266e+00, 5.56094e-01, 1.43116e+00, 2.92007e+00], [4.35384e-01, -2.05544e-01, 3.93904e-01, 6.72578e-01, -4.83340e-01, -9.10664e-02, 1.56137e+00, -2.24269e+00, 1.51632e+00, 2.87373e-01, -7.04453e-01, 5.18849e-01, -8.04111e-01, -1.49389e-01, -6.08015e-01, -9.31059e-01, 1.59634e+00, 4.75415e-01, -5.73098e-01, -3.01352e-01, 1.06692e+00, 2.27742e+00, 1.35555e+00, -1.35335e+00, 1.00866e+00, -2.54979e-01, -1.10551e-01, 8.39147e-01, -1.61272e+00, 1.47475e+00, -2.66824e-02, 1.05414e+00, -2.87045e-01, -1.11531e+00, 1.12445e+00, 4.31128e-01, 9.26344e-01, 4.09016e-01, -2.46922e-01, 1.07469e+00, 3.00758e+00, 1.09366e-01, 4.06269e-02, 9.64194e-01, 1.74056e+00, -3.22974e-02, 1.38383e+00, -3.43365e-01, 1.66659e+00, 1.45470e+00], [3.59458e-03, -8.19976e-03, 6.18136e-03, 4.02669e-03, -7.66940e-03, 3.39041e-03, -1.68293e-02, -4.71976e-03, -1.38701e-02, -6.68309e-01, -1.59921e-03, -2.09781e-02, 2.56297e-03, -1.02252e-02, -1.27338e-02, 7.56856e-04, 2.57955e-02, -2.40013e-02, -4.78265e-03, -2.33285e-03, -4.74267e-03, 2.94744e-02, -1.13512e-02, -1.41102e-02, -3.42400e-02, 1.48115e-02, -2.51518e-01, -4.87622e-01, -2.64920e+00, -1.75656e-02, 8.46394e-03, -1.68546e-01, -1.05126e-02, 7.26645e-03, -3.22406e-02, -2.72303e-02, -2.39166e+00, -2.44442e+00, -5.62913e+00, -1.20975e+00, -7.64948e-02, -1.98578e-02, -1.24611e-02, -2.34299e-01, -1.62923e+00, -1.56075e-02, -9.60138e-01, -1.83458e-02, 1.13516e-02, 4.77233e-03], [5.77822e-01, -2.45248e+00, -3.99112e+00, -1.87151e+00, -5.02746e+00, -2.48166e-01, -3.46821e+00, 8.33811e-03, -2.17141e+00, -4.97096e+00, -3.01766e+00, -5.83755e+00, -9.31898e-02, -3.39620e+00, 1.24546e+00, -2.23467e+00, 1.76284e+00, -6.49004e-01, -2.62127e+00, -6.75343e-01, -3.07350e+00, -2.86006e+00, -2.35646e+00, -3.17362e+00, -6.73726e+00, -2.24881e+00, 2.19362e-01, -6.69021e+00, -1.36694e-01, -1.35669e+00, -3.92880e+00, -6.24237e+00, -1.89967e+00, -1.43826e-01, 6.09327e-02, -5.80851e+00, 1.87406e-01, 2.15902e+00, -3.03142e+00, -4.06385e+00, -3.57049e+00, -2.20674e+00, -7.62960e-01, 1.89265e+00, -1.48972e+00, -2.86401e+00, -3.70208e+00, -5.76567e-01, -5.31604e+00, 1.79603e+00], [1.83676e+00, -2.91498e-01, 1.89847e-01, 1.82087e+00, 7.26962e-01, 1.57193e+00, 1.29550e+00, 9.93026e-01, 1.65342e-01, 2.11778e+00, -2.65211e+00, -1.21686e+00, -1.59206e+00, -1.41916e+00, 4.55185e-01, 3.89567e-01, -1.44194e+00, 1.49436e+00, -5.15158e-01, -5.36371e-01, 1.82314e+00, -4.41179e+00, 1.18492e+00, 5.21412e-01, 1.11861e+00, 9.43500e-01, -8.49356e-01, -3.99728e-02, -1.55106e-01, -1.64295e-01, 2.82137e-01, 1.30519e+00, -1.12088e+00, 1.07523e+00, 1.23894e+00, 1.21515e+00, -1.00306e-01, 7.54192e-01, 1.15668e+00, -2.55742e+00, -3.33124e+00, 6.33248e-01, 2.62795e+00, -3.38011e-01, 2.76534e+00, -3.87977e-01, 3.08142e-01, -4.30354e-01, 5.01586e-01, 3.50807e+00], [1.24226e-02, 1.10431e-01, -1.01259e+00, -3.52867e-01, -2.03477e+00, -1.75762e+00, -7.43800e-01, -1.42749e+00, -1.43984e+00, -1.42348e-01, -4.80315e-01, -1.71017e+00, -1.02698e-01, -7.32742e-02, -6.39507e-01, -6.63750e-01, -9.61381e-01, -3.13136e-01, -1.77384e-01, 4.36099e-02, -1.92520e+00, 4.47870e-01, -1.39317e-01, 5.22374e-03, -1.18816e+00, -3.09150e+00, -5.29055e-01, 6.18888e-02, 6.96314e-02, -1.02213e+00, -5.51016e-01, -5.75412e-01, -5.39226e-01, -1.77951e+00, -3.82012e-02, -3.04553e-01, -7.72532e-01, -8.60715e-01, -6.94258e-01, -5.18556e-01, -1.08650e-02, -5.36521e-01, -1.30926e+00, -1.11814e+00, 7.79752e-01, -1.39195e-01, 6.40034e-01, -3.38941e-01, 9.15411e-02, -1.23010e+00], [-9.75949e-01, 1.20913e+00, -3.03754e+00, 3.38386e+00, -6.55853e+00, -5.38617e-01, -4.50676e+00, -3.67713e-01, -2.60164e+00, -1.59903e+00, -6.67061e-01, -1.04499e+00, -1.63428e+00, -2.05215e+00, -6.27005e-01, -9.02325e-01, 1.78477e+00, -2.52885e+00, -3.92321e+00, -9.50885e-02, -1.19942e+00, -3.99936e+00, 7.06848e-01, -4.58639e+00, -3.00421e+00, -5.14619e+00, 1.16661e-01, -4.27477e+00, -7.19734e-01, -3.87107e+00, -2.40064e+00, -2.46440e+00, -2.44100e+00, -9.99576e-01, -1.30037e-01, -4.02286e+00, -1.16382e+00, 2.36267e+00, -2.36157e+00, -1.51609e+00, -3.07521e+00, -2.91207e+00, -2.51156e+00, -1.43999e+00, -3.16566e-01, -6.99926e-01, -2.22422e+00, -1.21667e+00, 1.69431e-01, 1.29644e+00], [7.59084e-01, 8.01890e-01, 6.79282e-01, -1.79477e+00, -5.06230e-03, 4.19668e-01, 9.58672e-01, 1.19568e+00, 1.84928e+00, 2.77560e+00, -4.85542e-01, -3.45531e+00, -5.45796e-01, -2.30663e+00, -2.45033e-01, -2.77307e-01, 3.37387e-01, 1.17944e+00, -8.02837e-01, -3.90627e-01, -4.34707e-02, 4.93030e-01, -1.19967e+00, 1.21282e+00, -1.02060e+00, 2.64638e-01, -5.87169e-01, 1.35049e+00, 1.32808e-02, 9.55351e-01, 3.29428e-01, -5.10238e-01, -4.00512e-01, 1.26875e+00, 1.02461e+00, 3.20283e+00, -1.93944e+00, -7.92146e-01, -7.03775e-01, -6.54360e-01, -1.65308e+00, -1.37682e-01, -4.21780e+00, -2.17024e-01, -7.87916e-01, -5.48100e-01, -1.32720e+00, -4.39047e-02, 7.81261e-01, 2.67710e+00], [-2.60718e+00, 8.50019e-01, -5.99249e+00, -8.43100e-01, -4.98881e+00, 1.15052e+00, -2.60778e+00, -8.74175e-01, -2.50847e+00, -4.19152e+00, -1.48231e+00, -5.26414e-01, -6.56271e-01, -2.78430e+00, -1.61676e+00, -1.55135e+00, -3.60036e-01, -2.53469e-01, -1.51597e+00, -1.79922e+00, -2.83200e+00, -1.62261e+00, -4.87950e-02, -3.24975e+00, -5.73967e+00, -2.29638e+00, -3.43889e-03, -6.01490e+00, 6.95551e-01, -3.96644e+00, -4.27294e-01, -6.88332e-01, -2.57206e+00, -3.83421e+00, 4.70894e-01, -2.12380e+00, 2.41405e-02, 4.92373e-01, -2.22066e+00, -2.63654e+00, -5.81833e+00, 7.82510e-01, -5.50051e+00, -3.65202e-01, -3.00599e+00, -3.63601e+00, -2.53146e+00, -4.69129e-02, -4.30331e+00, -2.28806e+00], [-1.38673e+00, -1.46612e+00, 4.21986e-01, -2.15605e+00, -1.11404e-01, 1.27535e+00, -2.86961e+00, 1.31400e+00, 1.35625e+00, 3.30026e+00, -2.23015e+00, -5.44260e-01, -2.52250e-01, 1.62474e+00, 6.02729e-01, 6.66720e-04, -2.87879e+00, -3.45487e+00, -2.91420e+00, -4.69946e-01, -1.22811e+00, 2.77564e+00, 5.82578e-01, 1.47676e+00, 3.80779e+00, -6.84713e+00, -1.43919e+00, -1.19598e+00, 9.44622e-02, 5.22598e-01, 2.13728e-01, 1.18443e+00, -9.49005e-01, 2.75159e+00, -3.79392e-01, 1.51018e+00, 1.87857e+00, -5.86708e-01, 8.79220e-01, 6.61703e-01, 1.40274e+00, 1.48741e+00, 1.44925e+00, 6.14571e-01, -7.18773e-01, -1.63805e-01, 7.63871e-01, -1.02819e+00, -9.66205e-02, 3.34538e+00], [9.47485e-01, -8.88793e-01, 6.96905e-01, 1.03810e+00, -1.57315e-01, 1.32259e+00, 1.22023e+00, -2.80994e+00, 1.47559e+00, 1.17217e+00, -4.01474e-01, 7.56504e-01, -1.44349e-01, -1.37035e+00, 1.02716e+00, -1.13129e-02, -2.21805e-01, -1.54291e+00, -1.07629e+00, -4.95423e-01, 1.51769e+00, -1.56303e+00, 1.64839e+00, -2.49354e-02, 1.32160e+00, 3.13732e-01, -4.42916e-01, -3.41159e-01, 9.76836e-01, -1.49565e+00, 4.43003e-01, -3.16333e-01, -1.39926e+00, 1.09158e+00, 2.71072e-01, 1.10867e+00, 3.63415e-01, -8.23858e-02, -8.36159e-02, 2.93691e-01, 1.55476e+00, 1.04637e+00, 2.28413e+00, -2.03023e+00, 3.13201e+00, 1.73756e-01, 1.06944e+00, -4.02672e-02, 1.74001e+00, 1.63903e+00]] +[-4.45462e-01, 5.62400e-03, 5.89068e+00, 2.77841e-01, 1.40840e+00, 1.46208e-02, 3.39046e+00, -5.82072e+00, -7.14864e+00, 4.25952e+00, -5.89017e+00, -6.12832e+00, 1.92275e-01, 1.21389e-01, -5.73660e+00, 3.08365e+00, 7.83543e-01, -5.58092e+00, -1.27750e+00, -9.13020e+00, -1.60800e+00, 3.39128e+00, -3.99809e+00, 1.56087e+00, -1.04304e+01, -8.98217e+00, -9.91012e+00, -4.88063e+00, -1.47045e+00, -3.56399e+00, -4.89964e+00, -6.07058e+00, 1.18896e+00, 5.69209e-02, -3.31694e+00, -5.30129e+00, -3.09108e-02, -7.21790e+00, 3.53086e+00, -1.27792e+01, -3.35543e+00, 1.12941e-01, 3.32683e+00, -6.00712e+00, 1.03079e+00, 4.65157e+00, -7.62273e+00, 1.97126e+00, -9.84769e-01, -9.08274e+00, ] +ReLU +[[-9.51356e-02, -2.22979e-02, -6.33151e-03, -8.40396e-03, 2.45446e-02, 5.31824e-03, -8.86438e-03, 8.35088e-03, 3.64966e-03, -1.39195e-02, 5.94725e-03, 3.46741e-03, 1.01027e-03, 3.42597e-03, 3.21230e-03, -6.59967e-03, 6.82855e-03, 5.31019e-03, -2.26668e-02, 2.48221e-03, 1.30637e-03, -1.11098e-02, 5.20208e-03, -5.20106e-03, 1.89907e-03, 4.80087e-03, 3.38263e-03, 7.33350e-03, -5.85999e-03, 5.07230e-03, 2.79465e-03, 4.19309e-03, -4.19862e-02, -1.69099e-02, 3.85188e-03, 5.46258e-03, 3.25345e-03, 5.74500e-03, -1.43218e-02, 2.48820e-03, 3.37939e-03, 1.63476e-04, -6.82584e-03, 3.23427e-03, -1.99525e-02, -5.58794e-03, 4.92059e-03, -1.27108e-02, 4.48274e-03, 3.99711e-03], [3.41369e-03, 1.88770e-03, -8.34984e-05, 3.40946e-04, -3.31490e-04, -4.42893e-04, 1.57528e-04, -7.68266e-04, -1.10867e-03, 8.85364e-04, -5.74967e-05, -4.45446e-04, 6.23063e-03, 3.81003e-03, 2.05502e-06, 9.53738e-04, -9.98671e-04, -1.00667e-03, -3.99822e-06, 4.94672e-05, -8.62808e-04, 8.52861e-04, -1.09531e-05, 2.37848e-04, 1.06589e-04, -5.40875e-04, -1.02445e-04, -7.07167e-04, -1.16845e-03, -1.06233e-04, -1.09839e-04, -8.72209e-04, -2.18234e-03, 2.11973e-04, 6.06344e-04, -1.09847e-04, -1.35821e-03, -1.52328e-04, 1.62783e-04, -9.69814e-04, -2.97743e-04, -3.11798e-03, 5.69821e-04, -3.23376e-05, 8.50102e-04, 4.39917e-04, -2.34037e-04, 9.60049e-04, 1.40754e-04, -7.53481e-05], [-1.25400e-03, 8.94158e-04, -3.03122e-04, -6.46678e-04, -2.61326e-04, -2.89380e-04, 3.32650e-04, 1.76162e-04, 1.93910e-03, -6.75485e-06, 1.17657e-03, 4.90595e-04, 1.11946e-02, 5.36627e-03, 1.31839e-03, -1.61391e-04, 6.40120e-04, 1.26014e-04, 6.03507e-04, -3.12422e-04, -3.16359e-04, -6.16220e-04, 3.00544e-04, 1.18252e-04, 1.58326e-04, -8.66311e-05, 1.99267e-04, 1.93484e-04, -9.66102e-05, 8.58869e-04, 1.79149e-04, -1.82584e-04, -1.83384e-03, 1.76642e-04, 1.26378e-04, -7.06107e-06, 2.06563e-02, -4.62604e-04, -3.76827e-04, 3.56520e-04, 3.35840e-04, -9.76277e-03, -2.19176e-04, 2.67810e-04, 1.19132e-03, 3.16581e-04, 7.77611e-04, -4.22035e-04, 1.73234e-05, -8.78440e-06], [-2.29016e-03, -5.36503e-04, 1.41985e-03, 1.25661e-03, -2.01187e-05, -8.19703e-05, 3.43571e-04, 5.55825e-05, -2.12435e-04, 2.17003e-03, 1.52579e-04, 8.53428e-04, 1.57278e-02, 6.49768e-03, 1.34340e-03, 1.88267e-03, 9.24013e-04, -6.28561e-04, -8.39472e-05, 2.52810e-04, 9.19614e-04, -1.02148e-03, -4.15421e-04, 1.75075e-04, 5.29421e-05, 2.15433e-04, -1.42746e-04, -2.99572e-04, 5.17548e-04, -4.53469e-04, -1.78366e-04, 7.81821e-04, -2.92129e-03, -2.95382e-04, 3.23113e-03, -9.61390e-05, 1.17189e-02, 6.67009e-04, -6.92915e-04, 2.31220e-04, 2.68844e-05, -1.10992e-02, -2.61363e-04, 8.43888e-04, 9.50246e-04, -1.80688e-04, 9.22557e-04, -2.64588e-04, 6.60628e-04, 1.44544e-03], [-1.52026e-03, 4.49468e-04, -2.22061e-04, 3.90152e-04, 1.29054e-04, -5.56167e-04, -1.43732e-04, 7.97761e-05, 7.06409e-04, 2.86401e-04, 1.44057e-04, 3.41538e-04, 1.37299e-02, 4.77681e-03, 2.20423e-04, -2.15062e-04, 9.68713e-04, 2.05602e-04, -4.48056e-04, -1.42797e-04, -2.21096e-04, -3.82816e-04, 2.77808e-04, -1.26446e-04, 7.93513e-05, -8.94536e-05, 9.92721e-04, 3.52616e-04, 8.32333e-04, 3.37465e-04, 6.89273e-04, 1.09770e-05, 9.25683e-04, -2.29256e-04, -8.79770e-05, 1.05290e-03, 2.03980e-02, -4.34820e-04, -4.44605e-04, -1.80175e-04, 1.28410e-03, -1.00219e-02, -1.94714e-04, 7.68009e-04, 1.27401e-03, 8.91767e-05, -2.09657e-04, 2.76205e-04, -2.57235e-06, 4.72037e-04]] +[-2.10782e-02, -1.97138e-02, 1.82674e-02, -1.85579e-02, 1.82602e-02, ] diff --git a/experiments/squeezenet_ft.py b/experiments/squeezenet_ft.py new file mode 100644 index 0000000..70a8fb5 --- /dev/null +++ b/experiments/squeezenet_ft.py @@ -0,0 +1,78 @@ +"""Fine-tuning SqueezeNet on NAE dataset. +""" +from collections import defaultdict +import random +import numpy as np +# pylint: disable=import-error +from pysyrenn import Network +from pysyrenn import ReluLayer, NormalizeLayer +from pysyrenn import FullyConnectedLayer, Conv2DLayer +from prdnn import FTRepair +from experiments.squeezenet_repair import SqueezenetRepair +from imagenet_helpers import read_imagenet_images + +class SqueezenetFT(SqueezenetRepair): + """Fine-tunes SqueezeNet with the NAE dataset (Hendrycks et al.)""" + def run(self): + """Fine-tune Squeezenet model and record patched versions.""" + network = self.load_network("squeezenet") + assert not isinstance(network.layers[-1], ReluLayer) + # Add a normalize layer to the start to take the images to the + # Squeezenet format. + normalize = NormalizeLayer( + means=np.array([0.485, 0.456, 0.406]), + standard_deviations=np.array([0.229, 0.224, 0.225])) + network = Network([normalize] + network.layers) + + # Get the trainset and record it. + train_inputs, train_labels = self.get_train(n_labels=9) + + sorted_labels = sorted(set(train_labels)) + train_labels = list(map(sorted_labels.index, train_labels)) + + self.record_artifact(train_inputs, f"train_inputs", "pickle") + self.record_artifact(sorted_labels, f"sorted_labels", "pickle") + self.record_artifact(train_labels, f"train_labels", "pickle") + + # Add a final layer which maps it into the subset of classes + # considered. + final_weights = np.zeros((1000, len(sorted_labels))) + final_biases = np.zeros(len(sorted_labels)) + for new_label, old_label in enumerate(sorted_labels): + final_weights[old_label, new_label] = 1. + final_layer = FullyConnectedLayer(final_weights, final_biases) + network = Network(network.layers + [final_layer]) + + # Record the network before patching. + self.record_artifact(network, f"pre_patching", "network") + + which_params = int(input("Which fine-tuning params? (1 or 2): ")) + assert which_params in {1, 2} + n_rows = int(input("How many rows of Table 1 to generate (1, 2, 3, or 4): ")) + for n_points in [100, 200, 400, 800][:n_rows]: + print("~~~~", "Points:", n_points, "~~~~") + key = f"{n_points}_-1" + + patcher = FTRepair( + network, train_inputs[:n_points], train_labels[:n_points]) + patcher.lr = 0.0001 + patcher.momentum = 0.0 + # This is just a maximum epoch timeout, it will stop once the + # constraints are met. + patcher.epochs = 500 + if which_params == 1: + patcher.batch_size = 2 + else: + patcher.batch_size = 16 + + patched = patcher.compute() + + self.record_artifact(patcher.timing, f"{key}/timing", "pickle") + self.record_artifact( + patched, f"{key}/patched", + "network" if patched is not None else "pickle") + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + SqueezenetFT("squeezenet_ft").main() diff --git a/experiments/squeezenet_mft.py b/experiments/squeezenet_mft.py new file mode 100644 index 0000000..de4f87f --- /dev/null +++ b/experiments/squeezenet_mft.py @@ -0,0 +1,86 @@ +"""Modified fine-tuning SqueezeNet on NAE dataset. +""" +from collections import defaultdict +import random +import numpy as np +# pylint: disable=import-error +from pysyrenn import Network +from pysyrenn import ReluLayer, NormalizeLayer +from pysyrenn import FullyConnectedLayer, Conv2DLayer +from prdnn import FTRepair +from experiments.squeezenet_repair import SqueezenetRepair +from imagenet_helpers import read_imagenet_images + +class SqueezenetMFT(SqueezenetRepair): + """Modified fine-tunes SqueezeNet with the NAE dataset (Hendrycks et al.)""" + def run(self): + """Modified fine-tune Squeezenet model and record patched versions.""" + network = self.load_network("squeezenet") + assert not isinstance(network.layers[-1], ReluLayer) + # Add a normalize layer to the start to take the images to the + # Squeezenet format. + normalize = NormalizeLayer( + means=np.array([0.485, 0.456, 0.406]), + standard_deviations=np.array([0.229, 0.224, 0.225])) + network = Network([normalize] + network.layers) + + # Get the trainset and record it. + train_inputs, train_labels = self.get_train(n_labels=9) + + sorted_labels = sorted(set(train_labels)) + train_labels = list(map(sorted_labels.index, train_labels)) + + self.record_artifact(train_inputs, f"train_inputs", "pickle") + self.record_artifact(sorted_labels, f"sorted_labels", "pickle") + self.record_artifact(train_labels, f"train_labels", "pickle") + + # Add a final layer which maps it into the subset of classes + # considered. + final_weights = np.zeros((1000, len(sorted_labels))) + final_biases = np.zeros(len(sorted_labels)) + for new_label, old_label in enumerate(sorted_labels): + final_weights[old_label, new_label] = 1. + final_layer = FullyConnectedLayer(final_weights, final_biases) + network = Network(network.layers + [final_layer]) + + # Record the network before patching. + self.record_artifact(network, f"pre_patching", "network") + + patchable = [i for i, layer in enumerate(network.layers) + if isinstance(layer, (FullyConnectedLayer, Conv2DLayer))] + which_params = int(input("Which fine-tuning params? (1 or 2): ")) + assert which_params in {1, 2} + n_rows = int(input("How many rows of Table 1 to generate (1, 2, 3, or 4): ")) + for n_points in [100, 200, 400, 800][:n_rows]: + print("~~~~", "Points:", n_points, "~~~~") + for layer in patchable: + print("::::", "Layer:", layer, "::::") + key = f"{n_points}_{layer}" + + patcher = FTRepair( + network, train_inputs[:n_points], train_labels[:n_points]) + patcher.layer = layer + patcher.norm_objective = True + patcher.auto_stop = False + patcher.make_holdout_set() + patcher.lr = 0.0001 + patcher.momentum = 0.0 + # This is just a maximum epoch timeout, it will stop once the + # constraints are met. + patcher.epochs = 500 + if which_params == 1: + patcher.batch_size = 2 + else: + patcher.batch_size = 16 + + patched = patcher.compute() + + self.record_artifact(patcher.timing, f"{key}/timing", "pickle") + self.record_artifact( + patched, f"{key}/patched", + "network" if patched is not None else "pickle") + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + SqueezenetMFT("squeezenet_mft").main() diff --git a/experiments/squeezenet_repair.py b/experiments/squeezenet_repair.py new file mode 100644 index 0000000..deeb70d --- /dev/null +++ b/experiments/squeezenet_repair.py @@ -0,0 +1,190 @@ +"""Repair SqueezeNet on the NAE dataset. +""" +from collections import defaultdict +import random +import numpy as np +# pylint: disable=import-error +from pysyrenn import Network +from pysyrenn import ReluLayer, NormalizeLayer +from pysyrenn import FullyConnectedLayer, Conv2DLayer +from prdnn import FTRepair +from experiments.experiment import Experiment +from imagenet_helpers import read_imagenet_images + +class SqueezenetRepair(Experiment): + """Repairs Imagenet with the NAE dataset (Hendrycks et al.)""" + def run(self): + """Repair Squeezenet model and record patched versions.""" + network = self.load_network("squeezenet") + assert not isinstance(network.layers[-1], ReluLayer) + # Add a normalize layer to the start to take the images to the + # Squeezenet format. + normalize = NormalizeLayer( + means=np.array([0.485, 0.456, 0.406]), + standard_deviations=np.array([0.229, 0.224, 0.225])) + network = Network([normalize] + network.layers) + + # Get the trainset and record it. + train_inputs, train_labels = self.get_train(n_labels=9) + + sorted_labels = sorted(set(train_labels)) + train_labels = list(map(sorted_labels.index, train_labels)) + + self.record_artifact(train_inputs, f"train_inputs", "pickle") + self.record_artifact(sorted_labels, f"sorted_labels", "pickle") + self.record_artifact(train_labels, f"train_labels", "pickle") + + # Add a final layer which maps it into the subset of classes + # considered. + final_weights = np.zeros((1000, len(sorted_labels))) + final_biases = np.zeros(len(sorted_labels)) + for new_label, old_label in enumerate(sorted_labels): + final_weights[old_label, new_label] = 1. + final_layer = FullyConnectedLayer(final_weights, final_biases) + network = Network(network.layers + [final_layer]) + + # Record the network before patching. + self.record_artifact(network, f"pre_patching", "network") + + # All the layers we can patch. + patchable = [i for i, layer in enumerate(network.layers) + if isinstance(layer, (FullyConnectedLayer, Conv2DLayer))] + n_rows = int(input("How many rows of Table 1 to generate (1, 2, 3, or 4): ")) + for n_points in [100, 200, 400, 800][:n_rows]: + print("~~~~", "Points:", n_points, "~~~~") + for layer in patchable: + print("::::", "Layer:", layer, "::::") + key = f"{n_points}_{layer}" + + patcher = ProvableRepair( + network, layer, + train_inputs[:n_points], train_labels[:n_points]) + patcher.batch_size = 8 + patcher.gurobi_timelimit = (n_points // 10) * 60 + patcher.gurobi_crossover = 0 + + patched = patcher.compute() + + self.record_artifact(patcher.timing, f"{key}/timing", "pickle") + self.record_artifact( + patched, f"{key}/patched", + "ddnn" if patched is not None else "pickle") + + def analyze(self): + """Compute drawdown statistics for patched models.""" + print("~~~~ Results ~~~~") + # Get the datasets and compute pre-patching accuracy. + network = self.read_artifact("pre_patching") + train_inputs = self.read_artifact("train_inputs") + train_labels = self.read_artifact("train_labels") + sorted_labels = self.read_artifact("sorted_labels") + + test_inputs, test_labels = self.get_test(sorted_labels) + + original_train_accuracy = self.accuracy( + network, train_inputs, train_labels) + original_test_accuracy = self.accuracy( + network, test_inputs, test_labels) + print("Max size of repair set:", len(train_inputs)) + print("Size of drawdown set:", len(test_inputs)) + print("Buggy network repair set accuracy:", original_train_accuracy) + print("Buggy network drawdown set accuracy:", original_test_accuracy) + + # Get info about the patch runs. + by_n_points = defaultdict(list) + by_layer = defaultdict(list) + for artifact in self.artifacts: + artifact = artifact["key"] + if "timing" not in artifact: + continue + key = artifact.split("/")[0] + n_points, layer = map(int, key.split("_")) + by_n_points[n_points].append(layer) + by_layer[layer].append(n_points) + + timing_cols = ["total", "jacobian", "solver", "did_timeout", + "efficacy", "drawdown"] + n_points_csvs = dict({ + n_points: + self.begin_csv(f"{n_points}_points", ["layer"] + timing_cols) + for n_points in by_n_points.keys() + }) + layer_csvs = dict({ + layer: self.begin_csv(f"{layer}_layer", ["points"] + timing_cols) + for layer in by_layer.keys() + }) + for n_points in sorted(by_n_points.keys()): + print("~~~~~", "Points:", min(int(n_points), len(train_inputs)), "~~~~~") + records_for_row = [] + for layer in sorted(by_n_points[n_points]): + timing = self.read_artifact(f"{n_points}_{layer}/timing") + record = timing.copy() + + patched = self.read_artifact(f"{n_points}_{layer}/patched") + if patched is not None: + new_train_accuracy = self.accuracy(patched, + train_inputs[:n_points], + train_labels[:n_points]) + new_test_accuracy = self.accuracy(patched, + test_inputs, + test_labels) + record["efficacy"] = new_train_accuracy + record["drawdown"] = (original_test_accuracy + - new_test_accuracy) + records_for_row.append(record) + else: + record["efficacy"] = 0 + record["drawdown"] = 0 + + record["layer"] = layer + self.write_csv(n_points_csvs[n_points], record) + del record["layer"] + record["points"] = n_points + self.write_csv(layer_csvs[layer], record) + best_record = min(records_for_row, key=lambda record: record["drawdown"]) + print("\tBest drawdown:", best_record["drawdown"]) + print("\tTotal time for best drawdown (seconds):", best_record["total"]) + return True + + @staticmethod + def get_train(n_labels=10): + """Reads the training (patch) set from disk.""" + np.random.seed(24) + random.seed(24) + + parent = input("ImageNet-A Dataset Path: ") + images, labels = read_imagenet_images(parent, n_labels=n_labels) + + indices = list(range(len(labels))) + random.shuffle(indices) + return images[indices], labels[indices] + + @staticmethod + def get_test(sorted_labels): + """Reads the test set from disk. + + @sorted_labels[i] gives the synset label corresponding to the ith + output of the model. Only returns images belonging to those classes. + """ + np.random.seed(24) + random.seed(24) + + parent = input("ImageNet-Val Dataset Path: ") + images, labels = read_imagenet_images( + parent, n_labels=None, use_labels=sorted_labels) + labels = np.array([sorted_labels.index(l) for l in labels]) + + indices = list(range(len(labels))) + random.shuffle(indices) + return images[indices], labels[indices] + + @staticmethod + def accuracy(network, inputs, labels): + """Computes accuracy on a test set.""" + out = np.argmax(network.compute(inputs), axis=1) + return 100. * np.count_nonzero(np.equal(out, labels)) / len(labels) + +if __name__ == "__main__": + np.random.seed(24) + random.seed(24) + SqueezenetRepair("squeezenet_repair").main() diff --git a/pip_info/README.md b/pip_info/README.md new file mode 100644 index 0000000..adb7af5 --- /dev/null +++ b/pip_info/README.md @@ -0,0 +1,16 @@ +# PRDNN +Provable Repair of DNNs. See our [Github +repository](https://github.com/95616ARG/PRDNN) for more information. + +## Prerequisites +You will need to install Gurobi. + +If you wish to do polytope patching, you will also need a running SyReNN +server. See [the SyReNN GitHub repository](https://github.com/95616ARG/syrenn) +for more details. We also use [PyTorch](https://pytorch.org/), please ensure +you have the desired version of PyTorch installed before installing this +package. + +## Supported Python Versions +We only test against Python 3.7.4, however we believe it should work for other +versions of Python as well. diff --git a/pip_info/__metadata__.py b/pip_info/__metadata__.py new file mode 100644 index 0000000..f06bd4c --- /dev/null +++ b/pip_info/__metadata__.py @@ -0,0 +1,11 @@ +__version__ = "1.0" +__title__ = "prdnn" +__description__ = "Provable Repair of DNNs" +__uri__ = "https://github.com/95616ARG/PRDNN" +__doc__ = __description__ + " <" + __uri__ + ">" + +__author__ = "Matthew Sotoudeh and Aditya V. Thakur" +__email__ = "masotoudeh@ucdavis.edu, avthakur@ucdavis.edu" + +__license__ = "MIT" +__copyright__ = "Copyright (c) 2020 Matthew Sotoudeh and Aditya V. Thakur" diff --git a/pip_info/setup.cfg b/pip_info/setup.cfg new file mode 100644 index 0000000..ed8a958 --- /dev/null +++ b/pip_info/setup.cfg @@ -0,0 +1,5 @@ +[bdist_wheel] +universal = 1 + +[metadata] +license_file = LICENSE diff --git a/pip_info/setup.py b/pip_info/setup.py new file mode 100644 index 0000000..e2184dc --- /dev/null +++ b/pip_info/setup.py @@ -0,0 +1,101 @@ +"""Setup script for prdnn. + +Adapted from: +https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/ +""" +import codecs +import os +import re + +from setuptools import setup, find_packages + +################################################################### + +NAME = "prdnn" +PACKAGES = [ + "prdnn", +] +META_PATH = "__metadata__.py" +KEYWORDS = ["class", "attribute", "boilerplate"] +CLASSIFIERS = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Natural Language :: English", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Software Development :: Libraries :: Python Modules", +] +INSTALL_REQUIRES = ["torch"] +with open("requirements.txt") as requirements: + reading = False + for line in requirements.readlines(): + if line.startswith("# PRDNN"): + reading = True + elif line.startswith("# END"): + reading = False + elif line.startswith("#"): + pass + elif line.startswith("pysyrenn=="): + # Releases before 1.1 did not have the necessary interfaces. + INSTALL_REQUIRES.append("pysyrenn>=1.1") + elif reading: + INSTALL_REQUIRES.append(line.strip().split("==")[0]) + +################################################################### + +HERE = os.path.abspath(os.path.dirname(__file__)) + +def read(*parts): + """ + Build an absolute path from *parts* and and return the contents of the + resulting file. Assume UTF-8 encoding. + """ + with codecs.open(os.path.join(HERE, *parts), "rb", "utf-8") as f: + return f.read() + +META_FILE = read(META_PATH) + +def find_meta(meta): + """Extract __*meta*__ from META_FILE. + """ + meta_match = re.search( + r"^__{meta}__ = ['\"]([^'\"]*)['\"]".format(meta=meta), + META_FILE, re.M + ) + if meta_match: + return meta_match.group(1) + raise RuntimeError("Unable to find __{meta}__ string.".format(meta=meta)) + + +if __name__ == "__main__": + setup( + name=NAME, + description=find_meta("description"), + license=find_meta("license"), + url=find_meta("uri"), + version=find_meta("version"), + author=find_meta("author"), + author_email=find_meta("email"), + maintainer=find_meta("author"), + maintainer_email=find_meta("email"), + keywords=KEYWORDS, + long_description=read("README.md"), + long_description_content_type="text/markdown", + packages=PACKAGES, + package_dir={"": "."}, + package_data={"": ["prdnn/*.py"]}, + zip_safe=False, + classifiers=CLASSIFIERS, + install_requires=INSTALL_REQUIRES, + ) diff --git a/prdnn/BUILD b/prdnn/BUILD new file mode 100644 index 0000000..206e83c --- /dev/null +++ b/prdnn/BUILD @@ -0,0 +1,30 @@ +py_library( + name = "prdnn", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], + deps = [ + ":ddnn", + ":ft_repair", + ":provable_repair", + ], +) + +py_library( + name = "provable_repair", + srcs = ["provable_repair.py"], + visibility = ["//visibility:public"], + deps = [":ddnn"], +) + +py_library( + name = "ft_repair", + srcs = ["ft_repair.py"], + visibility = ["//visibility:public"], + deps = [":provable_repair"], +) + +py_library( + name = "ddnn", + srcs = ["ddnn.py"], + visibility = ["//visibility:public"], +) diff --git a/prdnn/__init__.py b/prdnn/__init__.py new file mode 100644 index 0000000..421bfc6 --- /dev/null +++ b/prdnn/__init__.py @@ -0,0 +1,3 @@ +from prdnn.ddnn import DDNN +from prdnn.ft_repair import FTRepair +from prdnn.provable_repair import ProvableRepair diff --git a/prdnn/ddnn.py b/prdnn/ddnn.py new file mode 100644 index 0000000..7d0336a --- /dev/null +++ b/prdnn/ddnn.py @@ -0,0 +1,133 @@ +"""Methods for describing and executing Decoupled DNNs.""" +import numpy as np +from pysyrenn.frontend.network import Network +from pysyrenn.frontend import FullyConnectedLayer, Conv2DLayer +from pysyrenn.frontend import ReluLayer, HardTanhLayer +from pysyrenn.frontend import ConcatLayer, AveragePoolLayer +from pysyrenn.frontend import MaxPoolLayer, NormalizeLayer +import syrenn_proto.syrenn_pb2 as transformer_pb +import torch + +# NOTE: We currently only have limited support for concat layers, namely when +# the intermediate layers are all linear. +LINEAR_LAYERS = (FullyConnectedLayer, Conv2DLayer, ConcatLayer, + AveragePoolLayer, NormalizeLayer) + +class DDNN: + """Implements a DDNN. + + Currently supports: + - Arbitrary layers as long as the activation and values parameters are + equal up to that layer. + - Once the activation and values parameters differ, only linear (see + above), ReLU, HardTanh, and MaxPool layers are supported. Support for + other layer types can be added by modifying the compute(...) method. + """ + def __init__(self, activation_layers, value_layers): + """Constructs the new DDNN. + + @activation_layers is a list of layers defining the values of the + activation vectors. + @value_layers is a list of layers defining the values of the value + vectors. Non-linear layers here will be re-interpreted using the + corresponding decoupled value-network layer. + + Note that the number, types, and output sizes of the layers in + @activation_layers and @values_layers should match. + """ + self.activation_layers = activation_layers + self.value_layers = value_layers + + self.n_layers = len(activation_layers) + assert self.n_layers == len(value_layers) + + try: + self.differ_index = next( + l for l in range(self.n_layers) + if activation_layers[l] is not value_layers[l]) + except StopIteration: + self.differ_index = len(value_layers) + + def compute(self, inputs, representatives=None): + """Computes the output of the Decoupled Network on @inputs. + + @inputs should be a Numpy array of inputs. + """ + differ_index = self.differ_index + if representatives is not None: + differ_index = 0 + # Up to differ_index, the values and activation vectors are the same. + pre_network = Network(self.activation_layers[:differ_index]) + mid_inputs = pre_network.compute(inputs) + # Now we have to actually separately handle the masking when + # activations != values. + activation_vector = mid_inputs + if representatives is not None: + activation_vector = pre_network.compute(representatives) + value_vector = mid_inputs + for layer_index in range(differ_index, self.n_layers): + activation_layer = self.activation_layers[layer_index] + value_layer = self.value_layers[layer_index] + if isinstance(activation_layer, LINEAR_LAYERS): + if isinstance(activation_layer, ConcatLayer): + assert not any( + isinstance(input_layer, ConcatLayer) + for input_layer in activation_layer.input_layers) + assert all( + isinstance(input_layer, LINEAR_LAYERS) + for input_layer in activation_layer.input_layers) + activation_vector = activation_layer.compute(activation_vector) + value_vector = value_layer.compute(value_vector) + elif isinstance(activation_layer, ReluLayer): + mask = np.maximum(np.sign(activation_vector), 0.0) + if isinstance(value_vector, np.ndarray): + value_vector *= mask + else: + # NOTE: Originally this was torch.tensor(mask, + # dtype=torch.float). I changed to this to silence a + # warning from Pytorch. I don't think there will be, but it + # might be worth testing for a performance regression. + value_vector *= mask.clone().detach().float() + activation_vector *= mask + elif isinstance(activation_layer, HardTanhLayer): + mask = np.ones_like(value_vector) + value_vector[activation_vector >= 1.0] = 1.0 + value_vector[activation_vector <= -1.0] = -1.0 + np.clip(activation_vector, -1.0, 1.0, out=activation_vector) + elif isinstance(activation_layer, MaxPoolLayer): + activation_vector, indices = activation_layer.compute( + activation_vector, return_indices=True) + + value_vector = value_layer.from_indices(value_vector, indices) + else: + raise NotImplementedError + return value_vector + + def serialize(self): + """Serializes the DDNN to the Protobuf format. + + Notably, the value_net only includes layers after differ_index. + """ + serialized = transformer_pb.MaskingNetwork() + serialized.activation_layers.extend([ + layer.serialize() for layer in self.activation_layers + ]) + serialized.value_layers.extend([ + layer.serialize() + for layer in self.value_layers[self.differ_index:] + ]) + serialized.differ_index = self.differ_index + return serialized + + @classmethod + def deserialize(cls, serialized): + """Deserializes the DDNN from the Protobuf format.""" + activation_layers = serialized.activation_layers + activation_layers = Network.deserialize_layers(activation_layers) + + value_layers = serialized.value_layers + value_layers = Network.deserialize_layers(value_layers) + + differ_index = serialized.differ_index + value_layers = activation_layers[:differ_index] + value_layers + return cls(activation_layers, value_layers) diff --git a/prdnn/ft_repair.py b/prdnn/ft_repair.py new file mode 100644 index 0000000..197d9c4 --- /dev/null +++ b/prdnn/ft_repair.py @@ -0,0 +1,207 @@ +"""Methods for patching deep neural networks.""" +import random +import sys +import os +from timeit import default_timer as timer +import torch +import numpy as np +from scipy import sparse +from tqdm import tqdm +from pysyrenn.frontend import Network, FullyConnectedLayer +from pysyrenn.frontend import Conv2DLayer, ReluLayer +from pysyrenn.frontend import ConcatLayer, HardTanhLayer +from prdnn.ddnn import DDNN, LINEAR_LAYERS +from prdnn.provable_repair import ProvableRepair + +class FTRepair(ProvableRepair): + """Helper for patching a DDNN. + """ + def __init__(self, network, inputs, labels): + super().__init__(network, -1, inputs, labels) + self.epochs = 100 + self.batch_size = 16 + self.lr = 0.01 + self.momentum = 0.9 + self.auto_stop = True + self.norm_objective = False + self.layer = None + self.holdout_set = None + self.verbose = False + + def maybe_print(self, *messages): + if self.verbose: + print(*messages) + + def compute(self): + network = Network.deserialize(self.network.serialize()) + + if self.layer is not None: + for param in self.get_parameters(network): + param.requires_grad = False + + parameters = self.get_parameters(network, self.layer) + for param in parameters: + param.requires_grad = True + + if self.norm_objective: + original_parameters = [param.detach().clone() for param in parameters] + for param in original_parameters: + # Do not train these, they're just for reference. + param.requires_grad = False + + start = timer() + optimizer = torch.optim.SGD(parameters, lr=self.lr, momentum=self.momentum) + indices = list(range(len(self.inputs))) + random.seed(24) + self.epoched_out = None + holdout_n_correct = self.holdout_n_correct(network) + for epoch in range(self.epochs): + # NOTE: In the paper, we checked this _after_ the inner loop. It + # should only make a difference in the case where the network + # already met the specification, so should make no difference to + # the results. + if self.auto_stop and self.is_done(network): + self.maybe_print("100% training accuracy!") + self.epoched_out = False + break + random.shuffle(indices) + losses = [] + for batch_start in range(0, len(self.inputs), self.batch_size): + batch = slice(batch_start, batch_start + self.batch_size) + inputs = torch.tensor([self.inputs[i] for i in indices[batch]]) + labels = torch.tensor([self.labels[i] for i in indices[batch]]) + # representatives = [self.representatives[i] for i in indices[batch]] + + optimizer.zero_grad() + output = network.compute(inputs) + loss = torch.nn.functional.cross_entropy(output, labels) + if self.norm_objective: + for curr_param, og_param in zip(parameters, original_parameters): + delta = (curr_param - og_param).flatten() + loss += torch.linalg.norm(delta, ord=2) + loss += torch.linalg.norm(delta, ord=float("inf")) + loss.backward() + losses.append(loss) + optimizer.step() + self.maybe_print("Average Loss:", torch.mean(torch.tensor(losses))) + if self.holdout_set is not None: + new_holdout_n_correct = self.holdout_n_correct(network) + self.maybe_print("New holdout n correct:", new_holdout_n_correct, "/", len(self.holdout_set)) + if new_holdout_n_correct < holdout_n_correct: + self.maybe_print("Holdout accuracy dropped, ending!") + break + holdout_n_correct = new_holdout_n_correct + else: + self.epoched_out = True + for param in parameters: + param.requires_grad = False + self.timing = dict({ + "total": timer() - start, + }) + return network + + def is_done(self, network): + for batch_start in range(0, len(self.inputs), self.batch_size): + batch = slice(batch_start, batch_start + self.batch_size) + inputs = torch.tensor(self.inputs[batch]) + labels = torch.tensor(self.labels[batch]) + output = torch.argmax(network.compute(inputs), axis=1) + if not torch.all(output == labels): + return False + return True + + def accuracy_on_repair_set(self, network): + n_correct = 0 + for batch_start in range(0, len(self.inputs), self.batch_size): + batch = slice(batch_start, batch_start + self.batch_size) + inputs = torch.tensor(self.inputs[batch]) + labels = torch.tensor(self.labels[batch]) + output = torch.argmax(network.compute(inputs), axis=1) + n_correct += torch.sum(output == labels) + return n_correct / len(self.inputs) + + def holdout_n_correct(self, network): + if self.holdout_set is None: + return None + n_correct = 0 + for batch_start in range(0, len(self.holdout_set), self.batch_size): + batch = slice(batch_start, batch_start + self.batch_size) + inputs = torch.tensor(self.holdout_set[batch]) + labels = torch.tensor(self.holdout_labels[batch]) + output = torch.argmax(network.compute(inputs), axis=1) + n_correct += torch.sum(output == labels) + return n_correct + + def make_holdout_set(self): + assert self.holdout_set is None + indices = list(range(len(self.inputs))) + random.shuffle(indices) + holdout_indices = indices[:len(indices)//4] + self.holdout_set = self.inputs[holdout_indices] + self.holdout_labels = self.labels[holdout_indices] + self.inputs = [x for i, x in enumerate(self.inputs) + if i not in holdout_indices] + self.labels = [x for i, x in enumerate(self.labels) + if i not in holdout_indices] + + @classmethod + def from_planes(cls, network, planes, labels, + samples_per_plane, label_fn=None): + """Constructs a ProvableRepair to patch 2D regions. + + @planes should be a list of input 2D planes (Numpy arrays of their + vertices in counter-clockwise order). + @labels a list of the corresponding desired labels (integers). + """ + points = [] + point_labels = [] + if labels is None: + labels = [0 for i in planes] + for vertices, label, samples in zip(planes, labels, samples_per_plane): + coefficients = np.random.uniform( + 0., 1., size=(samples, len(vertices))) + coefficients = (coefficients.T / np.sum(coefficients, axis=1)).T + points.extend(list(np.matmul(coefficients, vertices))) + if not label_fn: + point_labels.extend(label for _ in range(samples)) + if label_fn: + point_labels = label_fn(points) + return cls(network, np.array(points), np.array(point_labels)) + + + @classmethod + def from_spec_function(cls, network, region_plane, + spec_function, samples_per_plane): + """Constructs a ProvableRepair for an input region and "Spec Function." + + @region_plane should be a single plane (Numpy array of + counter-clockwise vertices) that defines the "region of interest" + to patch over. + @spec_function should take a set of input points (Numpy array) and + return the desired corresponding labels (list/Numpy array of ints). + """ + if len(np.asarray(region_plane).shape) == 2: + region_plane = [region_plane] + assert len(np.asarray(region_plane).shape) == 3 + return cls.from_planes(network, region_plane, None, + samples_per_plane, label_fn=spec_function) + + @classmethod + def get_parameters(cls, network, layer=None): + if layer is not None: + return cls.get_parameters_layer(network.layers[layer]) + params = [] + for layer in network.layers: + params.extend(cls.get_parameters_layer(layer)) + return params + + @classmethod + def get_parameters_layer(cls, layer): + if isinstance(layer, FullyConnectedLayer): + return [layer.weights, layer.biases] + if isinstance(layer, Conv2DLayer): + return [layer.filter_weights, layer.biases] + if isinstance(layer, ConcatLayer): + return [param for in_layer in layer.input_layers + for param in cls.get_parameters_layer(in_layer)] + return [] diff --git a/prdnn/provable_repair.py b/prdnn/provable_repair.py new file mode 100644 index 0000000..387747f --- /dev/null +++ b/prdnn/provable_repair.py @@ -0,0 +1,523 @@ +"""Methods for patching deep neural networks.""" +import sys +import os +from timeit import default_timer as timer +import torch +import numpy as np +from scipy import sparse +from tqdm import tqdm +from pysyrenn.frontend import Network, FullyConnectedLayer +from pysyrenn.frontend import Conv2DLayer, ReluLayer +from pysyrenn.frontend import ConcatLayer, HardTanhLayer +if "GUROBI_HOME" in os.environ: + PY_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}" + if PY_VERSION == "3.7": + sys.path.append(os.environ["GUROBI_HOME"] + "/lib/python3.7") + elif PY_VERSION == "3.8": + sys.path.append(os.environ["GUROBI_HOME"] + "/lib/python3.8_utf32") + else: + # The user can figure it out. + pass +from gurobipy import Model, GRB +from prdnn.ddnn import DDNN, LINEAR_LAYERS + +class ProvableRepair: + """Helper for patching a DDNN. + + An instance of a ProvableRepair represents patching a specific network on a + specific pointwise patching specification with specific hyperparameters. + Polytope patching specifications can be specified using + ProvableRepair.from_planes or ProvableRepair.from_spec_function, which will + construct an equivalent pointwise patching specification. + """ + def __init__(self, network, layer_index, inputs, labels, + delta_bounds=(-3., 3.), representatives=None): + """Initializes a new ProvableRepair. + + By default, we only allow weight deltas to take values between -3. and + 3. to prevent numerical issues. This can be relaxed in some scenarios, + although I have found (-GRB.INFINITY, GRB.INFINITY) causing actual + significant issues. + + For raw feasibility, take delta_norm_type="none", + constraint_type="hard", slack_lb=0, slack_ub=INFTY. + + To do a strict relaxation of feasibility, take delta_norm_type="none", + constraint_type="linf", slack_lb=0, slack_ub=INFTY. Note that if the + model is feasible, these settings will find the satisfying model. + However, the behavior is less predictable if the model is infeasible. + In that scenario, it may have worst-case behavior. + + To do a better relaxation of feasibility, use constraint_type="l1" and + play with slack_*b, *_weight. + """ + self.network = network + self.layer_index = layer_index + self.inputs = np.asarray(inputs, dtype=np.float32) + self.representatives = representatives + if representatives is None: + self.representatives = self.inputs + self.labels = np.asarray(labels, dtype=np.int64) + self.epsilon = None + original_layer = network.layers[layer_index] + # intermediates[i] is the DDNN after i patching steps, so + # intermediates[0] is the original network. + self.intermediates = [self.construct_patched(original_layer)] + # times[i] is the time taken to run the ith iteration. + self.times = [0.0] + + self.delta_bounds = delta_bounds + # "hard", "l1", "linf" + self.constraint_type = "hard" + # Controls how much to prioritize improving already-met constraints vs. + # meeting more constraints. Setting slack_lb = 0 means that, once a + # constraint is met, 'meeting it more' won't improve the score. + # Changing slack_ub is a bit weirder, basically it controls the maximum + # 'badness' that an unmet constraint can contribute to the score. + self.soft_constraint_slack_lb = -0.05 + self.soft_constraint_slack_ub = GRB.INFINITY + self.soft_constraint_slack_type = GRB.CONTINUOUS + # Objective weights + self.delta_l1_weight = 1. + self.delta_linf_weight = 1. + self.soft_constraints_weight = 1. + self.normalize_objective = True + # We require Ax >= b + cb + self.constraint_buffer = 0.05 + # Batch size + self.batch_size = 128 + # Gurobi timeout (in seconds). + self.gurobi_timelimit = None + # Crossover parameter in Gurobi. + self.gurobi_crossover = -1 + self.timing = None + + def compute(self): + """Performs the Layer patching.""" + patch_start = timer() + layer = self.network.layers[self.layer_index] + if isinstance(layer, FullyConnectedLayer): + weights = layer.weights.numpy().copy() + biases = layer.biases.numpy().copy() + elif isinstance(layer, Conv2DLayer): + weights = layer.filter_weights.numpy().copy() + biases = layer.biases.numpy().copy() + else: + raise NotImplementedError + + model = Model() + if self.gurobi_timelimit is not None: + model.Params.TimeLimit = self.gurobi_timelimit + if self.gurobi_crossover != -1: + model.Params.Crossover = self.gurobi_crossover + model.Params.Method = 2 + + # Adding variables... + lb, ub = self.delta_bounds + weight_deltas = model.addVars(weights.flatten().size, lb=lb, ub=ub).select() + bias_deltas = model.addVars(biases.size, lb=lb, ub=ub).select() + all_deltas = weight_deltas + bias_deltas + + if self.constraint_type == "hard": + soft_constraint_bounds = [] + elif self.constraint_type == "linf": + soft_constraint_bounds = [model.addVar( + lb=self.soft_constraint_slack_lb, + ub=self.soft_constraint_slack_ub, + vtype=self.soft_constraint_slack_type)] + elif self.constraint_type == "l1": + out_dims = self.network.compute(self.inputs[:1]).shape[1] + soft_constraint_bounds = model.addVars( + len(self.inputs) * (out_dims - 1), + lb=self.soft_constraint_slack_lb, + ub=self.soft_constraint_slack_ub, + vtype=self.soft_constraint_slack_type).select() + else: + raise NotImplementedError + + # Adding constraints... + jacobian_compute_time = 0. + for batch_start in tqdm(range(0, len(self.inputs), self.batch_size)): + batch_slice = slice(batch_start, batch_start + self.batch_size) + batch_labels = self.labels[batch_slice] + + jacobian_start = timer() + A_batch, b_batch = self.network_jacobian(batch_slice) + jacobian_compute_time += (timer() - jacobian_start) + + out_dims = A_batch.shape[1] + assert out_dims == b_batch.shape[1] + + variables = None + if self.constraint_type == "l1": + variables = weight_deltas + bias_deltas + bounds + weight_softs = 1. + if self.soft_constraint_slack_type == GRB.BINARY: + weight_softs = 10. + + full_As, full_bs = [], [] + bounds_slice = slice(batch_slice.start * (out_dims - 1), + batch_slice.stop * (out_dims - 1)) + constraint_bounds_batch = soft_constraint_bounds[bounds_slice] + for i, (A, b, label) in enumerate(zip(A_batch, b_batch, batch_labels)): + other_labels = [l for l in range(out_dims) if l != label] + # A[label]x + b[label] >= A[other]x + b[other] + # (A[label] - A[other])x >= b[other] - b[label] + As = np.expand_dims(A[label], 0) - A[other_labels] + bs = (b[other_labels] - np.expand_dims(b[label], 0)) + bs += self.constraint_buffer + + if self.constraint_type == "linf": + As = np.concatenate((As, weight_softs * np.ones((As.shape[0], 1))), axis=1) + elif self.constraint_type == "l1": + bounds = constraint_bounds_batch[ + i*(out_dims-1):((i+1)*(out_dims-1))] + As = np.concatenate((As, weight_softs * np.eye(len(bounds))), axis=1) + + full_As.append(As) + full_bs.extend(bs) + model.addMConstr(np.concatenate(tuple(full_As), axis=0), + variables, '>', full_bs) + + # Specifying objective... + objective = 0. + if self.delta_l1_weight != 0.: + # Penalize the L_1 norm. To do this, we must add variables which + # represent the absolute value of each of the deltas. The approach + # used here is described at: + # https://optimization.mccormick.northwestern.edu/index.php/Optimization_with_absolute_values + n_vars = len(all_deltas) + abs_ub = max(abs(lb), abs(ub)) + variable_abs = model.addVars(n_vars, lb=0., ub=abs_ub).select() + n_vars += n_vars + + A = sparse.diags([1., -1.], [0, (n_vars // 2)], + shape=(n_vars // 2, n_vars), + dtype=np.float, format="lil") + b = np.zeros(n_vars // 2) + model.addMConstr(A, all_deltas + variable_abs, '<', b) + + A = sparse.diags([-1., -1.], [0, (n_vars // 2)], + shape=(n_vars // 2, n_vars), + dtype=np.float, format="lil") + model.addMConstr(A, all_deltas + variable_abs, '<', b) + + # Then the objective we use is just the L_1 norm. TODO: maybe we + # should wait until the end to weight this so the coefficients + # aren't too small? + if self.normalize_objective: + weight = self.delta_l1_weight / len(variable_abs) + else: + weight = self.delta_l1_weight + objective += (weight * sum(variable_abs)) + if self.delta_linf_weight != 0.: + # Penalize the L_infty norm. We use a similar approach, except it + # only takes one additional variable. For some reason it throws an + # error if I use just addVar here. + l_inf = model.addVar(lb=0., ub=max(abs(lb), abs(ub))) + n_vars = len(weight_deltas) + len(bias_deltas) + 1 + + A = sparse.eye(n_vars - 1, n_vars, dtype=np.float, format="lil") + A[:, -1] = -1. + b = np.zeros(n_vars - 1) + model.addMConstr(A, all_deltas + [l_inf], '<', b) + + A = sparse.diags([-1.], shape=(n_vars - 1, n_vars), + dtype=np.float, format="lil") + A[:, -1] = -1. + model.addMConstr(A, all_deltas + [l_inf], '<', b) + + # L_inf objective. + objective += (self.delta_linf_weight * l_inf) + # Soft constraint weight. + if self.normalize_objective: + weight = self.soft_constraints_weight / max(len(soft_constraint_bounds), 1) + else: + weight = self.soft_constraints_weight + objective += weight * sum(soft_constraint_bounds) + model.setObjective(objective, GRB.MINIMIZE) + + # Solving... + gurobi_start = timer() + model.update() + model.optimize() + gurobi_solve_time = (timer() - gurobi_start) + + self.timing = dict({ + "jacobian": jacobian_compute_time, + "solver": gurobi_solve_time, + }) + self.timing["did_timeout"] = (model.status == GRB.TIME_LIMIT) + if model.status != GRB.OPTIMAL: + print("Not optimal!") + print("Model status:", model.status) + self.timing["total"] = (timer() - patch_start) + return None + + # Extracting weights... + weights += np.asarray([d.X for d in weight_deltas]).reshape(weights.shape) + biases += np.asarray([d.X for d in bias_deltas]).reshape(biases.shape) + + # Returning a patched network! + if isinstance(layer, FullyConnectedLayer): + patched_layer = FullyConnectedLayer(weights.copy(), biases.copy()) + else: + patched_layer = Conv2DLayer(layer.window_data, weights.copy(), biases.copy()) + + patched = self.construct_patched(patched_layer) + + self.timing["total"] = (timer() - patch_start) + return patched + + def network_jacobian(self, batch_slice): + """Returns A, b st A x delta + b = network output for a given batch. + + Essentially, this method returns the Jacobian of the network output wrt + the given layer's weights and biases. Unfortunately, Pytorch is *really + bad* at computing Jacobians. It can compute gradients of a single + scalar, but not Jacobians of a vector output (or a matrix, as we need). + + This method takes the following approach: + 1. If the layer in question is a fully-connected layer, we can manually + compute the Jacobian using self.layer_jacobian(...). + 2. Otherwise, we assume the layer is a 2D convolutional layer and use + Pytorch to compute the Jacobian, which takes m*n Jacobian queries + where m is the number of points and n is the number of output + classes. + + TODO(masotoud, good starter project): For case (2), Pytorch recently + introduced a Jacobian method that does exactly that. We can probably + simplify this function by using their implementation. + + TODO(masotoud, follow-up project): In fact, there exist a number of + optimized Jacobian implementations for Pytorch (see, e.g., the + "backpack" project). However, using them seems to require significant + modifications to the way we call Pytorch. Long-term, it would be nice + to move to one of those (or at least re-use their primitives). + """ + inputs = self.inputs[batch_slice] + representatives = self.representatives[batch_slice] + + layer = self.network.layers[self.layer_index] + + original_outputs = self.network.compute(inputs) + n_inputs, out_dims = original_outputs.shape + + if isinstance(layer, FullyConnectedLayer): + weight_scales, bias_scales = self.layer_jacobian( + inputs, representatives) + # weight_scales is (n_inputs, out_dims, in_dims, mid_dims) + # bias_scales is (n_inputs, out_dims, mid_dims) + else: + # This *SHOULD* be possible in general, but I don't know how to + # express it nicely in Numpy/Pytorch. Trying to run layer_jacobian + # will create a huge matrix, which is not what we want. The + # approach below is pretty slow (due primarily to limitations with + # Jacobian computation in Pytorch) but should work as long as we're + # not using representatives. + filters = layer.filter_weights + biases = layer.biases + + def set_grad(v, g): + v.requires_grad_(g) + def maybe_zero(v): + if v is not None: + v.zero_() + + for v in [filters, biases]: + set_grad(v, True) + pytorch_x = torch.tensor(inputs, requires_grad=True, dtype=torch.float) + if self.inputs is self.representatives: + output = self.network.compute(pytorch_x) + else: + masknet = DDNN(self.network.layers, self.network.layers) + output = masknet.compute(pytorch_x, representatives) + assert len(output.shape) == 2 + n_inputs, out_dims = output.shape + + weight_scales = np.zeros((n_inputs, out_dims,) + filters.shape) + bias_scales = np.zeros((n_inputs, out_dims,) + biases.shape) + for i in range(output.shape[0]): + for j in range(output.shape[1]): + maybe_zero(filters.grad) + maybe_zero(biases.grad) + output[i, j].backward(retain_graph=True) + weight_scales[i, j, :, :, :] = filters.grad.numpy() + bias_scales[i, j, :] = biases.grad.numpy() + + for v in [filters, biases]: + set_grad(v, False) + weight_scales = np.array(weight_scales) + bias_scales = np.array(bias_scales) + + # (n_inputs, out_dims, [filter_shape]) -> (out, [filter_size]) + weight_scales = weight_scales.reshape((n_inputs, out_dims, -1)) + # (n_inputs, out_dims, [bias_shape]) + bias_scales = bias_scales.reshape((n_inputs, out_dims, -1)) + return np.concatenate((weight_scales, bias_scales), axis=2), original_outputs + + def layer_jacobian(self, points, representatives): + """Computes the Jacobian of the FULLY CONNECTED layer parameters. + + Returns (n_points, n_outputs, [weight_shape]) + + Basically, we assume WLOG that the layer is the first layer then we get + something like for each point: + B_nB_{n-1}...B_1Ax + + For each point we can collapse B_n...B_1 into a matrix B of shape + (n_outputs, n_A_outputs) + then we compute the einsum with x to get + (n_outputs, n_A_outputs, n_A_inputs) + which is what we want. + """ + pre_network = Network(self.network.layers[:self.layer_index]) + points = pre_network.compute(points) + n_points, A_in_dims = points.shape + + representatives = pre_network.compute(representatives) + representatives = self.network.layers[self.layer_index].compute(representatives) + n_points, A_out_dims = representatives.shape + + post_network = Network(self.network.layers[(self.layer_index+1):]) + # (n_points, A_out, A_out) + jacobian = np.repeat([np.eye(A_out_dims)], n_points, axis=0) + # (A_out, n_points, A_out) + jacobian = jacobian.transpose((1, 0, 2)) + for layer in post_network.layers: + if isinstance(layer, LINEAR_LAYERS): + if isinstance(layer, ConcatLayer): + assert not any(isinstance(input_layer, ConcatLayer) + for input_layer in layer.input_layers) + assert all(isinstance(input_layer, LINEAR_LAYERS) + for input_layer in layer.input_layers) + representatives = layer.compute(representatives) + jacobian = jacobian.reshape((A_out_dims * n_points, -1)) + jacobian = layer.compute(jacobian, jacobian=True) + jacobian = jacobian.reshape((A_out_dims, n_points, -1)) + elif isinstance(layer, ReluLayer): + # (n_points, running_dims) + zero_indices = (representatives <= 0) + representatives[zero_indices] = 0. + # (A_out, n_points, running_dims) + jacobian[:, zero_indices] = 0. + elif isinstance(layer, HardTanhLayer): + big_indices = (representatives >= 1.) + small_indices = (representatives <= -1.) + np.clip(representatives, -1.0, 1.0, out=representatives) + jacobian[:, big_indices] = 0. + jacobian[:, small_indices] = 0. + else: + raise NotImplementedError + # (A_out, n_points, n_classes) -> (n_points, n_classes, A_out) + B = jacobian.transpose((1, 2, 0)) + # (n_points, n_classes, n_A_in, n_A_out) + C = np.einsum("nco,ni->ncio", B, points) + return C, B + + def set_points(self, inputs, labels, representatives=None): + """Change the pointwise patching specification.""" + self.inputs = np.asarray(inputs, dtype=np.float32) + self.labels = labels + self.representatives = representatives + if representatives is None: + self.representatives = self.inputs + + @classmethod + def from_planes(cls, network, layer_index, planes, labels, use_representatives=False): + """Constructs a ProvableRepair to repair 2D regions. + + @planes should be a list of input 2D planes (Numpy arrays of their + vertices in counter-clockwise order). + @labels a list of the corresponding desired labels (integers). + + Internally, SyReNN is used to lower the problem to that of finitely + many points. + + NOTE: This function requires one to have a particularly precise + representation of the desired network output; in most cases, + ProvableRepair.from_spec_function is more useful (see below). + """ + transformed = network.transform_planes(planes, + compute_preimages=True, + include_post=False) + all_inputs = [] + all_labels = [] + all_representatives = [] if use_representatives else None + for upolytope, label in zip(transformed, labels): + # include_post=False so the upolytope is just a list of Numpy + # arrays. + if use_representatives: + points = [] + for vertices in upolytope: + all_inputs.extend(vertices) + representative = np.mean(vertices, axis=0) + all_representatives.extend(representative + for _ in vertices) + all_labels.extend(label for _ in vertices) + else: + points = [] + for vertices in upolytope: + points.extend(vertices) + # Remove duplicate points. + points = list(set(map(tuple, points))) + all_inputs.extend(points) + all_labels.extend(label for _ in points) + if not use_representatives: + all_inputs, indices = np.unique(all_inputs, return_index=True, axis=0) + all_labels = np.asarray(all_labels)[indices] + return cls(network, layer_index, all_inputs, all_labels, + representatives=all_representatives) + + @classmethod + def from_spec_function(cls, network, layer_index, region_plane, + spec_function, use_representatives=False): + """Constructs a ProvableRepair for an input region and "Spec Function." + + @region_plane should be a single plane (Numpy array of + counter-clockwise vertices) that defines the "region of interest" + to patch over. + @spec_function should take a set of input points (Numpy array) and + return the desired corresponding labels (list/Numpy array of ints). + + Here we use a slightly in-exact algorithm; we get all partition + endpoints using SyReNN, then use those for the ProvableRepair. + + If the @spec_function classifies all points on a linear partition the + same way, then this exactly encodes the corresponding problem for the + ProvableRepair (i.e., if the ProvableRepair reports all constraints met + then the repaired network exactly matches the @spec_function). + + If the @spec_function classifies some points on a linear partition + differently than others, the encoding may not be exact (i.e., + ProvableRepair may report all constraints met even when some input has + a different output in the patched network than the @spec_function). + However, in practice, this works *very* well and is significantly more + efficient than computing the exact encoding and resulting patches. + """ + if len(np.asarray(region_plane).shape) == 2: + region_plane = [region_plane] + assert len(np.asarray(region_plane).shape) == 3 + upolytopes = network.transform_planes(region_plane, + compute_preimages=True, + include_post=False) + inputs = [] + representatives = [] if use_representatives else None + for upolytope in upolytopes: + for polytope in upolytope: + inputs.extend(list(polytope)) + if use_representatives: + representative = np.mean(polytope, axis=0) + representatives.extend(representative for _ in polytope) + if not use_representatives: + inputs = np.unique(np.asarray(inputs, dtype=np.float32), axis=0) + labels = spec_function(inputs) + return cls(network, layer_index, inputs, labels, + representatives=representatives) + + def construct_patched(self, patched_layer): + """Constructs a DDNN given the patched layer.""" + activation_layers = self.network.layers + value_layers = activation_layers.copy() + value_layers[self.layer_index] = patched_layer + return DDNN(activation_layers, value_layers) diff --git a/prdnn/tests/BUILD b/prdnn/tests/BUILD new file mode 100644 index 0000000..5740d71 --- /dev/null +++ b/prdnn/tests/BUILD @@ -0,0 +1,29 @@ +py_test( + name = "test_provable_repair", + size = "small", + srcs = ["test_provable_repair.py"], + deps = [ + "//prdnn:provable_repair", + "@bazel_python//:pytest_helper", + ], +) + +py_test( + name = "test_ft_repair", + size = "small", + srcs = ["test_ft_repair.py"], + deps = [ + "//prdnn:ft_repair", + "@bazel_python//:pytest_helper", + ], +) + +py_test( + name = "test_ddnn", + size = "small", + srcs = ["test_ddnn.py"], + deps = [ + "//prdnn:ddnn", + "@bazel_python//:pytest_helper", + ], +) diff --git a/prdnn/tests/test_ddnn.py b/prdnn/tests/test_ddnn.py new file mode 100644 index 0000000..0b926f8 --- /dev/null +++ b/prdnn/tests/test_ddnn.py @@ -0,0 +1,166 @@ +"""Tests the methods in ddnn.py.""" +# pylint: disable=import-error +import numpy as np +import torch +from pysyrenn import ReluLayer, FullyConnectedLayer, ArgMaxLayer +from pysyrenn import HardTanhLayer, MaxPoolLayer, StridedWindowData +try: + from external.bazel_python.pytest_helper import main + IN_BAZEL = True +except ImportError: + IN_BAZEL = False +from prdnn.ddnn import DDNN + +def test_compute(): + """Tests that it works for a simple example.""" + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + value_layers = activation_layers[:2] + [ + FullyConnectedLayer(3.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + network = DDNN(activation_layers, value_layers) + assert network.differ_index == 2 + output = network.compute([[-2.0, 1.0]]) + assert np.allclose(output, [[0.0, 6.0]]) + output = network.compute(torch.tensor([[-2.0, 1.0]])).numpy() + assert np.allclose(output, [[0.0, 6.0]]) + + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + HardTanhLayer(), + ] + value_layers = [ + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + HardTanhLayer(), + ] + network = DDNN(activation_layers, value_layers) + output = network.compute([[0.5, -0.9]]) + assert np.allclose(output, [[1.0, -1.8]]) + + # Test HardTanh + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + HardTanhLayer(), + ] + value_layers = [ + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + HardTanhLayer(), + ] + network = DDNN(activation_layers, value_layers) + output = network.compute([[0.5, -0.9]]) + assert np.allclose(output, [[1.0, -1.8]]) + + # Test MaxPool + width, height, channels = 2, 2, 2 + window_data = StridedWindowData((height, width, channels), + (2, 2), (2, 2), (0, 0), channels) + maxpool_layer = MaxPoolLayer(window_data) + activation_layers = [ + FullyConnectedLayer(np.eye(8), np.ones(shape=(8,))), + maxpool_layer, + ] + value_layers = [ + FullyConnectedLayer(-1. * np.eye(8), np.zeros(shape=(8,))), + maxpool_layer, + ] + network = DDNN(activation_layers, value_layers) + output = network.compute([[1.0, 2.0, -1.0, -2.5, 0.0, 0.5, 1.5, -3.5]]) + # NHWC, so the two channels are: [1, -1, 0, 1.5] and [2, -2.5, 0.5, -3.5] + # So the maxes are 1.5 and 2.0, so the value layer outputs -1.5, -2.0 + assert np.allclose(output, [[-1.5, -2.0]]) + +def test_compute_representatives(): + """Tests that the linear-region endpoints work.""" + activation_layers = [ + FullyConnectedLayer(np.eye(1), np.zeros(shape=(1,))), + ReluLayer(), + ] + value_layers = [ + FullyConnectedLayer(np.eye(1), np.ones(shape=(1,))), + ReluLayer(), + ] + network = DDNN(activation_layers, value_layers) + assert network.differ_index == 0 + points = np.array([[0.0], [0.0]]) + representatives = np.array([[1.0], [-1.0]]) + output = network.compute(points, representatives=representatives) + assert np.array_equal(output, [[1.], [0.]]) + +def test_nodiffer(): + """Tests the it works if activation and value layers are identical.""" + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + value_layers = activation_layers + network = DDNN(activation_layers, value_layers) + assert network.differ_index == 4 + output = network.compute([[-2.0, 1.0]]) + assert np.allclose(output, [[0.0, 4.0]]) + +def test_bad_layer(): + """Tests that unspported layers after differ_index fail.""" + # It should work if it's before the differ_index. + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + ArgMaxLayer(), + ] + value_layers = activation_layers + network = DDNN(activation_layers, value_layers) + assert network.differ_index == 4 + output = network.compute([[-2.0, 1.0]]) + assert np.allclose(output, [[1.0]]) + # But not after the differ_index. + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + ArgMaxLayer(), + ] + value_layers = activation_layers[:2] + [ + FullyConnectedLayer(3.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + network = DDNN(activation_layers, value_layers) + assert network.differ_index == 2 + try: + output = network.compute([[-2.0, 1.0]]) + assert False + except NotImplementedError: + pass + +def test_serialization(): + """Tests that it correctly (de)serializes.""" + activation_layers = [ + FullyConnectedLayer(np.eye(2), np.ones(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(2.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + value_layers = activation_layers[:2] + [ + FullyConnectedLayer(3.0 * np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ] + network = DDNN(activation_layers, value_layers) + serialized = network.serialize() + assert all(serialized == layer.serialize() + for serialized, layer in zip(serialized.activation_layers, + activation_layers)) + assert all(serialized == layer.serialize() + for serialized, layer in zip(serialized.value_layers, + value_layers[2:])) + assert serialized.differ_index == 2 + + assert DDNN.deserialize(serialized).serialize() == serialized + +if IN_BAZEL: + main(__name__, __file__) diff --git a/prdnn/tests/test_ft_repair.py b/prdnn/tests/test_ft_repair.py new file mode 100644 index 0000000..7f75614 --- /dev/null +++ b/prdnn/tests/test_ft_repair.py @@ -0,0 +1,54 @@ +"""Tests the methods in netpatch.py +""" +import numpy as np +import torch +import pytest +from pysyrenn.frontend import Network, ReluLayer, FullyConnectedLayer +try: + from external.bazel_python.pytest_helper import main + IN_BAZEL = True +except ImportError: + IN_BAZEL = False +from prdnn.ft_repair import FTRepair + +def test_already_good(): + """Point-wise test case where all constraints are already met. + + We want to make sure that it doesn't change any weights unnecessarily. + """ + network = Network([ + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ]) + layer_index = 0 + points = [[1.0, 0.5], [2.0, -0.5], [4.0, 5.0]] + labels = [0, 0, 1] + patcher = FTRepair(network, points, labels) + patcher.layer = layer_index + patched = patcher.compute() + patched_layer = patched.layers[0] + assert np.allclose(patched_layer.weights.numpy(), np.eye(2)) + assert np.allclose(patched_layer.biases.numpy(), np.zeros(shape=(2,))) + +def test_one_point(): + """Point-wise test case with only one constraint. + + This leads to weight bounds that are unbounded-on-one-side. + """ + # Where the weight is too big. + network = Network([ + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(np.array([[1.0, 0.0], [1.0, 0.0]]), + np.array([0.0, 0.0])), + ]) + layer_index = 0 + points = [[1.0, 0.5]] + labels = [1] + patcher = FTRepair(network, points, labels) + patcher.epochs = 10000 + patched = patcher.compute() + assert np.argmax(patched.compute(points)) == 1 + +if IN_BAZEL: + main(__name__, __file__) diff --git a/prdnn/tests/test_provable_repair.py b/prdnn/tests/test_provable_repair.py new file mode 100644 index 0000000..bf97a44 --- /dev/null +++ b/prdnn/tests/test_provable_repair.py @@ -0,0 +1,150 @@ +"""Tests the methods in netpatch.py +""" +import numpy as np +import torch +import pytest +from pysyrenn.frontend import Network, ReluLayer, FullyConnectedLayer +try: + from external.bazel_python.pytest_helper import main + IN_BAZEL = True +except ImportError: + IN_BAZEL = False +from prdnn.provable_repair import ProvableRepair + +def test_already_good(): + """Point-wise test case where all constraints are already met. + + We want to make sure that it doesn't change any weights unnecessarily. + """ + network = Network([ + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ]) + layer_index = 0 + points = [[1.0, 0.5], [2.0, -0.5], [4.0, 5.0]] + labels = [0, 0, 1] + patcher = ProvableRepair(network, layer_index, points, labels) + patched = patcher.compute() + patched_layer = patched.value_layers[0] + assert np.allclose(patched_layer.weights.numpy(), np.eye(2)) + assert np.allclose(patched_layer.biases.numpy(), np.zeros(shape=(2,))) + +def test_one_point(): + """Point-wise test case with only one constraint. + + This leads to weight bounds that are unbounded-on-one-side. + """ + # Where the weight is too big. + network = Network([ + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + FullyConnectedLayer(np.array([[1.0, 0.0], [1.0, 0.0]]), + np.array([0.0, 0.0])), + ]) + layer_index = 0 + points = [[1.0, 0.5]] + labels = [1] + patcher = ProvableRepair(network, layer_index, points, labels) + patched = patcher.compute() + assert np.argmax(patched.compute(points)) == 1 + + # Where the weight is too small. + network = Network([ + FullyConnectedLayer(np.eye(2), np.array([0.0, 0.0])), + ReluLayer(), + FullyConnectedLayer(np.array([[1.0, 0.0], [1.0, 0.0]]), np.array([0.0, 2.0])), + ]) + layer_index = 0 + points = [[1.0, 0.0]] + labels = [0] + patcher = ProvableRepair(network, layer_index, points, labels) + patched = patcher.compute() + assert np.argmax(patched.compute(points)) == 0 + +def test_optimal(): + """Point-wise test case that the greedy algorithm can solve in 1 step. + + All it needs to do is triple the second component. + """ + network = Network([ + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))), + ReluLayer(), + ]) + layer_index = 0 + points = [[1.0, 0.5], [2.0, -0.5], [5.0, 4.0]] + labels = [1, 0, 1] + patcher = ProvableRepair(network, layer_index, points, labels) + patched = patcher.compute() + assert patched.differ_index == 0 + assert np.count_nonzero( + np.argmax(patched.compute(points), axis=1) == labels) == 3 + +def test_from_planes(): + """Test case to load key points from a set of labeled 2D polytopes. + """ + if not Network.has_connection(): + pytest.skip("No server connected.") + + network = Network([ + ReluLayer(), + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))) + ]) + layer_index = 1 + planes = [ + np.array([[-1.0, -3.0], [-0.5, -3.0], [-0.5, 9.0], [-1.0, 9.0]]), + np.array([[8.0, -2.0], [16.0, -2.0], [16.0, 6.0], [8.0, 6.0]]), + ] + labels = [1, 0] + patcher = ProvableRepair.from_planes(network, layer_index, planes, labels) + assert patcher.network is network + assert patcher.layer_index is layer_index + assert len(patcher.inputs) == (4 + 2) + (4 + 2) + true_key_points = list(planes[0]) + true_key_points += [np.array([-1.0, 0.0]), np.array([-0.5, 0.0])] + true_key_points += list(planes[1]) + true_key_points += [np.array([8.0, 0.0]), np.array([16.0, 0.0])] + true_labels = ([1] * 6) + ([0] * 6) + for true_point, true_label in zip(true_key_points, true_labels): + try: + i = next(i for i, point in enumerate(patcher.inputs) + if np.allclose(point, true_point)) + except StopIteration: + assert False + assert true_label == patcher.labels[i] + +def test_from_spec(): + """Test case to load key points from a spec function. + """ + if not Network.has_connection(): + pytest.skip("No server connected.") + + network = Network([ + ReluLayer(), + FullyConnectedLayer(np.eye(2), np.zeros(shape=(2,))) + ]) + layer_index = 1 + region_of_interest = np.array([ + [0.5, -3.0], + [1.0, -3.0], + [1.0, 9.0], + [0.5, 9.0], + ]) + spec_fn = lambda i: np.isclose(i[:, 0], 1.0).astype(np.float32) + patcher = ProvableRepair.from_spec_function(network, layer_index, + region_of_interest, spec_fn) + assert patcher.network is network + assert patcher.layer_index is layer_index + assert len(patcher.inputs) == (4 + 2) + true_key_points = list(region_of_interest) + true_key_points += [np.array([0.5, 0.0]), np.array([1.0, 0.0])] + true_labels = [0, 1, 1, 0, 0, 1] + for true_point, true_label in zip(true_key_points, true_labels): + try: + i = next(i for i, point in enumerate(patcher.inputs) + if np.allclose(point, true_point)) + except StopIteration: + assert False + assert true_label == patcher.labels[i] + +if IN_BAZEL: + main(__name__, __file__) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9a0bffa --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +# PRDNN +pysyrenn==1.1 +scipy==1.5.2 +# END +numpy==1.17.2 +imageio==2.5.0 +Pillow==7.1.0 +# For building the package. +setuptools==41.2.0 +wheel==0.33.6 +# For testing +pytest==5.2.0 +coverage==4.5.4 |