summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sotoudeh <masotoudeh@ucdavis.edu>2021-06-06 14:11:45 -0700
committerGitHub <noreply@github.com>2021-06-06 14:11:45 -0700
commit76f7d9e6af6f4aa17e5a3f898cca379bf148cde3 (patch)
tree19d5377b9810d4a38d46afdbcde87c829fee20a0
parent9e854eadcd4af185fd60d9297e9cc7dbcf283e04 (diff)
parent44e1df2ef44bb01abae66151961a9cc29425f398 (diff)
Initial code release for PLDI '21
Contains the initial code release for PRDNN, including the experiments from PLDI '21.
-rw-r--r--.github/workflows/test_prdnn.yml30
-rw-r--r--.gitignore3
-rw-r--r--BUILD46
-rw-r--r--LICENSE21
-rw-r--r--README.md122
-rw-r--r--WORKSPACE42
-rw-r--r--experiments/BUILD109
-rw-r--r--experiments/README.md9
-rw-r--r--experiments/acas_ft.py71
-rw-r--r--experiments/acas_mft.py86
-rw-r--r--experiments/acas_repair.py222
-rw-r--r--experiments/experiment.py357
-rw-r--r--experiments/imagenet_helpers.py180
-rw-r--r--experiments/mnist_ft.py159
-rw-r--r--experiments/mnist_mft.py170
-rw-r--r--experiments/mnist_repair.py206
-rw-r--r--experiments/models/README.md4
-rw-r--r--experiments/models/acas_2_9.eran21
-rw-r--r--experiments/squeezenet_ft.py78
-rw-r--r--experiments/squeezenet_mft.py86
-rw-r--r--experiments/squeezenet_repair.py190
-rw-r--r--pip_info/README.md16
-rw-r--r--pip_info/__metadata__.py11
-rw-r--r--pip_info/setup.cfg5
-rw-r--r--pip_info/setup.py101
-rw-r--r--prdnn/BUILD30
-rw-r--r--prdnn/__init__.py3
-rw-r--r--prdnn/ddnn.py133
-rw-r--r--prdnn/ft_repair.py207
-rw-r--r--prdnn/provable_repair.py523
-rw-r--r--prdnn/tests/BUILD29
-rw-r--r--prdnn/tests/test_ddnn.py166
-rw-r--r--prdnn/tests/test_ft_repair.py54
-rw-r--r--prdnn/tests/test_provable_repair.py150
-rw-r--r--requirements.txt13
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
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..d27f4b5
--- /dev/null
+++ b/BUILD
@@ -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",
+ ],
+)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6e2c4d2
--- /dev/null
+++ b/LICENSE
@@ -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.
diff --git a/README.md b/README.md
index 4c87da4..9b3ac9a 100644
--- a/README.md
+++ b/README.md
@@ -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
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback