Repository: FreyrS/dMaSIF Branch: master Commit: 0dcc26c3c218 Files: 34 Total size: 9.9 MB Directory structure: gitextract_4r95syc5/ ├── .gitignore ├── Arguments.py ├── LICENSE.md ├── README.md ├── benchmark_layers.py ├── benchmark_models.py ├── benchmark_scripts/ │ ├── DGCNN_site.sh │ ├── Pointnet_site.sh │ ├── dMaSIF_search.sh │ └── dMaSIF_site.sh ├── data.py ├── data_analysis/ │ ├── analyse_atomnet.ipynb │ ├── analyse_descriptors.py │ ├── analyse_descriptors_para.py │ ├── analyse_output.ipynb │ ├── analyse_site_outputs.py │ ├── analyse_site_outputs_graph.ipynb │ ├── plot_search.ipynb │ └── profiling_surface.ipynb ├── data_iteration.py ├── data_preprocessing/ │ ├── convert_pdb2npy.py │ ├── convert_ply2npy.py │ └── download_pdb.py ├── geometry_processing.py ├── helper.py ├── lists/ │ ├── testing.txt │ ├── testing_ppi.txt │ ├── training.txt │ └── training_ppi.txt ├── main_inference.py ├── main_training.py ├── model.py ├── models/ │ └── dMaSIF_search_3layer_12A_16dim └── requirements.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ 01-benchmark_surfaces/ 01-benchmark_surfaces_npy/ 01-benchmark_pdbs_npy/ 01-benchmark_pdbs/ 01-benchmark_pdbs/ shape_index/ masif_preds/ runs/ venv/ preds/ *.log NeurIPS_2020_benchmarks/ *.out figures/ timings/ data_analysis/roc_curves data_analysis/.ipynb_checkpoints/ .ipynb_checkpoints/ ================================================ FILE: Arguments.py ================================================ import argparse parser = argparse.ArgumentParser(description="Network parameters") # Main parameters parser.add_argument( "--experiment_name", type=str, help="Name of experiment", required=True ) parser.add_argument( "--use_mesh", type=bool, default=False, help="Use precomputed surfaces" ) parser.add_argument( "--embedding_layer", type=str, default="dMaSIF", choices=["dMaSIF", "DGCNN", "PointNet++"], help="Which convolutional embedding layer to use", ) parser.add_argument("--profile", type=bool, default=False, help="Profile code") # Geometric parameters parser.add_argument( "--curvature_scales", type=list, default=[1.0, 2.0, 3.0, 5.0, 10.0], help="Scales at which we compute the geometric features (mean and Gauss curvatures)", ) parser.add_argument( "--resolution", type=float, default=1.0, help="Resolution of the generated point cloud", ) parser.add_argument( "--distance", type=float, default=1.05, help="Distance parameter in surface generation", ) parser.add_argument( "--variance", type=float, default=0.1, help="Variance parameter in surface generation", ) parser.add_argument( "--sup_sampling", type=int, default=20, help="Sup-sampling ratio around atoms" ) # Hyper-parameters for the embedding parser.add_argument( "--atom_dims", type=int, default=6, help="Number of atom types and dimension of resulting chemical features", ) parser.add_argument( "--emb_dims", type=int, default=8, help="Number of input features (+ 3 xyz coordinates for DGCNNs)", ) parser.add_argument( "--in_channels", type=int, default=16, help="Number of embedding dimensions", ) parser.add_argument( "--orientation_units", type=int, default=16, help="Number of hidden units for the orientation score MLP", ) parser.add_argument( "--unet_hidden_channels", type=int, default=8, help="Number of hidden units for TangentConv UNet", ) parser.add_argument( "--post_units", type=int, default=8, help="Number of hidden units for the post-processing MLP", ) parser.add_argument( "--n_layers", type=int, default=1, help="Number of convolutional layers" ) parser.add_argument( "--radius", type=float, default=9.0, help="Radius to use for the convolution" ) parser.add_argument( "--k", type=int, default=40, help="Number of nearset neighbours for DGCNN and PointNet++", ) parser.add_argument( "--dropout", type=float, default=0.0, help="Amount of Dropout for the input features", ) # Training parser.add_argument( "--n_epochs", type=int, default=50, help="Number of training epochs" ) parser.add_argument( "--batch_size", type=int, default=1, help="Number of proteins in a batch" ) parser.add_argument( "--device", type=str, default="cuda:0", help="Which gpu/cpu to train on" ) parser.add_argument( "--restart_training", type=str, default="", help="Which model to restart the training from", ) parser.add_argument( "--n_rocauc_samples", type=int, default=100, help="Number of samples for the Matching ROC-AUC", ) parser.add_argument( "--validation_fraction", type=float, default=0.1, help="Fraction of training dataset to use for validation", ) parser.add_argument("--seed", type=int, default=42, help="Random seed") parser.add_argument( "--random_rotation", type=bool, default=False, help="Move proteins to center and add random rotation", ) parser.add_argument( "--single_protein", type=bool, default=False, help="Use single protein in a pair or both", ) parser.add_argument("--site", type=bool, default=False, help="Predict interaction site") parser.add_argument( "--search", type=bool, default=False, help="Predict matching between two partners", ) parser.add_argument( "--no_chem", type=bool, default=False, help="Predict without chemical information" ) parser.add_argument( "--no_geom", type=bool, default=False, help="Predict without curvature information" ) parser.add_argument( "--single_pdb", type=str, default="", help="Which structure to do inference on", ) parser.add_argument( "--pdb_list", type=str, default="", help="Which structures to do inference on", ) ================================================ FILE: LICENSE.md ================================================ Attribution-NonCommercial-NoDerivatives 4.0 International ======================================================================= Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. c. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. d. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. e. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. f. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. g. Licensor means the individual(s) or entity(ies) granting rights under this Public License. h. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and b. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material, You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only and provided You do not Share Adapted Material; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. ================================================ FILE: README.md ================================================ ## dMaSIF - Fast end-to-end learning on protein surfaces ![Method overview](overview.PNG) ## Abstract Proteins’ biological functions are defined by the geometric and chemical structure of their 3D molecular surfaces. Recent works have shown that geometric deep learning can be used on mesh-based representations of proteins to identify potential functional sites, such as binding targets for potential drugs. Unfortunately though, the use of meshes as the underlying representation for protein structure has multiple drawbacks including the need to pre-compute the input features and mesh connectivities. This becomes a bottleneck for many important tasks in protein science. In this paper, we present a new framework for deep learning on protein structures that addresses these limitations. Among the key advantages of our method are the computation and sampling of the molecular surface on-the-fly from the underlying atomic point cloud and a novel efficient geometric convolutional layer. As a result, we are able to process large collections of proteins in an end-to-end fashion, taking as the sole input the raw 3D coordinates and chemical types of their atoms, eliminating the need for any hand-crafted pre-computed features. To showcase the performance of our approach, we test it on two tasks in the field of protein structural bioinformatics: the identification of interaction sites and the prediction of protein-protein interactions. On both tasks, we achieve state-of-the-art performance with much faster run times and fewer parameters than previous models. These results will considerably ease the deployment of deep learning methods in protein science and open the door for end-to-end differentiable approaches in protein modeling tasks such as function prediction and design. ## Hardware requirements Models have been trained on either a single NVIDIA RTX 2080 Ti or a single Tesla V100 GPU. Time and memory benchmarks were performed on a single Tesla V100. ## Software prerequisites Scripts have been tested using the following two sets of core dependencies: | Dependency | First Option | Second Option | | ------------- | ------------- | ------------- | | GCC | 7.5.0 | 8.4.0 | | CMAKE | 3.10.2 | 3.16.5 | | CUDA | 10.0.130 | 10.2.89 | | cuDNN | 7.6.4.38 | 7.6.5.32 | | Python | 3.6.9 | 3.7.7 | | PyTorch | 1.4.0 | 1.6.0 | | PyKeops | 1.4 | 1.4.1 | | PyTorch Geometric | 1.5.0 | 1.6.1 | ## Code overview Usage: - In order to **train models**, run `main_training.py` with the appropriate flags. Available flags and their descriptions can be found in `Arguments.py`. - The command line options needed to reproduce the **benchmarks** can be found in `benchmark_scripts/`. - To make **inference** on the testing set using pretrained models, use `main_inference.py` with the flags that were used for training the models. Note that the `--experiment_name flag` should be modified to specify the training epoch to use. Implementation: - Our **surface generation** algorithm, **curvature** estimation method and **quasi-geodesic convolutions** are implemented in `geometry_processing.py`. - The **definition of the neural network** along with surface and input features can be found in `model.py`. The convolutional layers are implemented in `benchmark_models.py`. - The scripts used to **generate the figures** of the paper can be found in `data_analysis/`. ## License Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. ## Reference Sverrisson, F., Feydy, J., Correia, B. E., & Bronstein, M. M. (2020). Fast end-to-end learning on protein surfaces. [bioRxiv](https://www.biorxiv.org/content/10.1101/2020.12.28.424589v1). ================================================ FILE: benchmark_layers.py ================================================ import torch from typing import Optional from pykeops.torch import LazyTensor from torch_geometric.nn import EdgeConv, Reshape from torch_cluster import knn from math import ceil from torch_geometric.nn.inits import reset from torch.nn import ELU, Conv1d from torch.nn import Sequential as S, Linear as L, BatchNorm1d as BN def ranges_slices(batch): """Helper function for the diagonal ranges function.""" Ns = batch.bincount() indices = Ns.cumsum(0) ranges = torch.cat((0 * indices[:1], indices)) ranges = ( torch.stack((ranges[:-1], ranges[1:])).t().int().contiguous().to(batch.device) ) slices = (1 + torch.arange(len(Ns))).int().to(batch.device) return ranges, slices def diagonal_ranges(batch_x=None, batch_y=None): """Encodes the block-diagonal structure associated to a batch vector.""" if batch_x is None and batch_y is None: return None ranges_x, slices_x = ranges_slices(batch_x) ranges_y, slices_y = ranges_slices(batch_y) return ranges_x, slices_x, ranges_y, ranges_y, slices_y, ranges_x @torch.jit.ignore def keops_knn( x: torch.Tensor, y: torch.Tensor, k: int, batch_x: Optional[torch.Tensor] = None, batch_y: Optional[torch.Tensor] = None, cosine: bool = False, ) -> torch.Tensor: r"""Straightforward modification of PyTorch_geometric's knn method.""" x = x.view(-1, 1) if x.dim() == 1 else x y = y.view(-1, 1) if y.dim() == 1 else y y_i = LazyTensor(y[:, None, :]) x_j = LazyTensor(x[None, :, :]) if cosine: D_ij = -(y_i | x_j) else: D_ij = ((y_i - x_j) ** 2).sum(-1) D_ij.ranges = diagonal_ranges(batch_y, batch_x) idy = D_ij.argKmin(k, dim=1) # (N, K) rows = torch.arange(k * len(y), device=idy.device) // k return torch.stack([rows, idy.view(-1)], dim=0) knns = {"torch": knn, "keops": keops_knn} @torch.jit.ignore def knn_graph( x: torch.Tensor, k: int, batch: Optional[torch.Tensor] = None, loop: bool = False, flow: str = "source_to_target", cosine: bool = False, target: Optional[torch.Tensor] = None, batch_target: Optional[torch.Tensor] = None, backend: str = "torch", ) -> torch.Tensor: r"""Straightforward modification of PyTorch_geometric's knn_graph method to allow for source/targets.""" assert flow in ["source_to_target", "target_to_source"] if target is None: target = x if batch_target is None: batch_target = batch row, col = knns[backend]( x, target, k if loop else k + 1, batch, batch_target, cosine=cosine ) row, col = (col, row) if flow == "source_to_target" else (row, col) if not loop: mask = row != col row, col = row[mask], col[mask] return torch.stack([row, col], dim=0) class MyDynamicEdgeConv(EdgeConv): r"""Straightforward modification of PyTorch_geometric's DynamicEdgeConv layer.""" def __init__(self, nn, k, aggr="max", **kwargs): super(MyDynamicEdgeConv, self).__init__(nn=nn, aggr=aggr, **kwargs) self.k = k def forward(self, x, batch=None): """""" edge_index = knn_graph( x, self.k, batch, loop=False, flow=self.flow, backend="keops" ) return super(MyDynamicEdgeConv, self).forward(x, edge_index) def __repr__(self): return "{}(nn={}, k={})".format(self.__class__.__name__, self.nn, self.k) class MyXConv(torch.nn.Module): def __init__( self, in_channels=None, out_channels=None, dim=None, kernel_size=None, hidden_channels=None, dilation=1, bias=True, backend="torch", ): super(MyXConv, self).__init__() self.in_channels = in_channels if hidden_channels is None: hidden_channels = in_channels // 4 if hidden_channels == 0: hidden_channels = 1 self.hidden_channels = hidden_channels self.out_channels = out_channels self.dim = dim self.kernel_size = kernel_size self.dilation = dilation self.backend = backend C_in, C_delta, C_out = in_channels, hidden_channels, out_channels D, K = dim, kernel_size self.mlp1 = S( L(dim, C_delta), ELU(), BN(C_delta), L(C_delta, C_delta), ELU(), BN(C_delta), Reshape(-1, K, C_delta), ) self.mlp2 = S( L(D * K, K ** 2), ELU(), BN(K ** 2), Reshape(-1, K, K), Conv1d(K, K ** 2, K, groups=K), ELU(), BN(K ** 2), Reshape(-1, K, K), Conv1d(K, K ** 2, K, groups=K), BN(K ** 2), Reshape(-1, K, K), ) C_in = C_in + C_delta depth_multiplier = int(ceil(C_out / C_in)) self.conv = S( Conv1d(C_in, C_in * depth_multiplier, K, groups=C_in), Reshape(-1, C_in * depth_multiplier), L(C_in * depth_multiplier, C_out, bias=bias), ) self.reset_parameters() def reset_parameters(self): reset(self.mlp1) reset(self.mlp2) reset(self.conv) def forward(self, x, source, batch_source, target, batch_target): """""" # Load data shapes: # pos = pos.unsqueeze(-1) if pos.dim() == 1 else pos (Nin, _), (N, D), K = source.size(), target.size(), self.kernel_size # Compute K-nn: row, col = knn_graph( source, K * self.dilation, batch_source, loop=True, flow="target_to_source", target=target, batch_target=batch_target, backend=self.backend, ) # row is a vector of size N*K*dilation that indexes "target" # col is a vector of size N*K*dilation that indexes "source" # If needed, sup-sample the K-NN graph: if self.dilation > 1: dil = self.dilation index = torch.randint( K * dil, (N, K), dtype=torch.long, layout=torch.strided, device=row.device, ) arange = torch.arange(N, dtype=torch.long, device=row.device) arange = arange * (K * dil) index = (index + arange.view(-1, 1)).view(-1) # (N*K,) row, col = row[index], col[index] # assert row.max() < N # assert col.max() < Nin # Line 1: local difference vector: pos = source[col] - target[row] # (N * K, D) # Line 2: compute F_delta x_star = self.mlp1(pos.view(N * K, D)) # Line 3: concatenate the features and reshape: if x is not None: x = x.unsqueeze(-1) if x.dim() == 1 else x x = x[col].view(N, K, self.in_channels) x_star = torch.cat([x_star, x], dim=-1) x_star = x_star.transpose(1, 2).contiguous() x_star = x_star.view(N, self.in_channels + self.hidden_channels, K, 1) # Line 4: Compute the transformation matrix: transform_matrix = self.mlp2(pos.view(N, K * D)) transform_matrix = transform_matrix.view(N, 1, K, K) # Line 5: Apply it to the neighborhood: x_transformed = torch.matmul(transform_matrix, x_star) x_transformed = x_transformed.view(N, -1, K) # (N, I+H, K) # Line 6: Apply the convolution filter: out = self.conv(x_transformed) # (N, Cout) return out def __repr__(self): return "{}({}, {})".format( self.__class__.__name__, self.in_channels, self.out_channels ) ================================================ FILE: benchmark_models.py ================================================ import torch import torch.nn.functional as F import torch.nn as nn from torch.nn import ( Sequential as Seq, Dropout, Linear as Lin, LeakyReLU, ReLU, BatchNorm1d as BN, ) import torch_geometric.transforms as T from torch_geometric.data import DataLoader from torch_geometric.nn import ( DynamicEdgeConv, PointConv, XConv, fps, radius, global_max_pool, knn_interpolate, ) from pykeops.torch import LazyTensor from benchmark_layers import MyDynamicEdgeConv, MyXConv from geometry_processing import dMaSIFConv, mesh_normals_areas, tangent_vectors from helper import diagonal_ranges DEConv = {"torch": DynamicEdgeConv, "keops": MyDynamicEdgeConv} # Dynamic Graph CNNs =========================================================== # Adapted from the PyTorch_geometric gallery to get a close fit to # the original paper. def MLP(channels, batch_norm=True): """Multi-layer perceptron, with ReLU non-linearities and batch normalization.""" return Seq( *[ Seq( Lin(channels[i - 1], channels[i]), BN(channels[i]) if batch_norm else nn.Identity(), LeakyReLU(negative_slope=0.2), ) for i in range(1, len(channels)) ] ) class DGCNN_seg(torch.nn.Module): def __init__( self, in_channels, out_channels, n_layers, k=40, aggr="max", backend="keops" ): super(DGCNN_seg, self).__init__() self.name = "DGCNN_seg_" + backend self.I, self.O = ( in_channels + 3, out_channels, ) # Add coordinates to input channels self.n_layers = n_layers self.transform_1 = DEConv[backend](MLP([2 * 3, 64, 128]), k, aggr) self.transform_2 = MLP([128, 1024]) self.transform_3 = MLP([1024, 512, 256], batch_norm=False) self.transform_4 = Lin(256, 3 * 3) self.conv_layers = nn.ModuleList( [DEConv[backend](MLP([2 * self.I, self.O, self.O]), k, aggr)] + [ DEConv[backend](MLP([2 * self.O, self.O, self.O]), k, aggr) for i in range(n_layers - 1) ] ) self.linear_layers = nn.ModuleList( [ nn.Sequential( nn.Linear(self.O, self.O), nn.ReLU(), nn.Linear(self.O, self.O) ) for i in range(n_layers) ] ) self.linear_transform = nn.ModuleList( [nn.Linear(self.I, self.O)] + [nn.Linear(self.O, self.O) for i in range(n_layers - 1)] ) def forward(self, positions, features, batch_indices): # Lab: (B,), Pos: (N, 3), Batch: (N,) pos, feat, batch = positions, features, batch_indices # TransformNet: x = pos # Don't use the normals! x = self.transform_1(x, batch) # (N, 3) -> (N, 128) x = self.transform_2(x) # (N, 128) -> (N, 1024) x = global_max_pool(x, batch) # (B, 1024) x = self.transform_3(x) # (B, 256) x = self.transform_4(x) # (B, 3*3) x = x[batch] # (N, 3*3) x = x.view(-1, 3, 3) # (N, 3, 3) # Apply the transform: x0 = torch.einsum("ni,nij->nj", pos, x) # (N, 3) # Add features to coordinates x = torch.cat([x0, feat], dim=-1).contiguous() for i in range(self.n_layers): x_i = self.conv_layers[i](x, batch) x_i = self.linear_layers[i](x_i) x = self.linear_transform[i](x) x = x + x_i return x # Reference PointNet models, from the PyTorch_geometric gallery ========================= class SAModule(torch.nn.Module): """Set abstraction module.""" def __init__(self, ratio, r, nn, max_num_neighbors=64): super(SAModule, self).__init__() self.ratio = ratio self.r = r self.conv = PointConv(nn) self.max_num_neighbors = max_num_neighbors def forward(self, x, pos, batch): # Subsample with Farthest Point Sampling: # idx = fps(pos, batch, ratio=self.ratio) # Extract self.ratio indices TURN OFF FOR NOW idx = torch.arange(0, len(pos), device=pos.device) # For each "cluster", get the list of (up to 64) neighbors in a ball of radius r: row, col = radius( pos, pos[idx], self.r, batch, batch[idx], max_num_neighbors=self.max_num_neighbors, ) # Applies the PointNet++ Conv: edge_index = torch.stack([col, row], dim=0) x = self.conv(x, (pos, pos[idx]), edge_index) # Return the features and sub-sampled point clouds: pos, batch = pos[idx], batch[idx] return x, pos, batch class GlobalSAModule(torch.nn.Module): def __init__(self, nn): super(GlobalSAModule, self).__init__() self.nn = nn def forward(self, x, pos, batch): x = self.nn(torch.cat([x, pos], dim=1)) x = global_max_pool(x, batch) pos = pos.new_zeros((x.size(0), 3)) batch = torch.arange(x.size(0), device=batch.device) return x, pos, batch class FPModule(torch.nn.Module): def __init__(self, k, nn): super(FPModule, self).__init__() self.k = k self.nn = nn def forward(self, x, pos, batch, x_skip, pos_skip, batch_skip): x = knn_interpolate(x, pos, pos_skip, batch, batch_skip, k=self.k) if x_skip is not None: x = torch.cat([x, x_skip], dim=1) x = self.nn(x) return x, pos_skip, batch_skip class PointNet2_seg(torch.nn.Module): def __init__(self, args, in_channels, out_channels): super(PointNet2_seg, self).__init__() self.name = "PointNet2" self.I, self.O = in_channels, out_channels self.radius = args.radius self.k = 10000 # We don't restrict the number of points in a patch self.n_layers = args.n_layers # self.sa1_module = SAModule(1.0, self.radius, MLP([self.I+3, self.O, self.O]),self.k) self.layers = nn.ModuleList( [SAModule(1.0, self.radius, MLP([self.I + 3, self.O, self.O]), self.k)] + [ SAModule(1.0, self.radius, MLP([self.O + 3, self.O, self.O]), self.k) for i in range(self.n_layers - 1) ] ) self.linear_layers = nn.ModuleList( [ nn.Sequential( nn.Linear(self.O, self.O), nn.ReLU(), nn.Linear(self.O, self.O) ) for i in range(self.n_layers) ] ) self.linear_transform = nn.ModuleList( [nn.Linear(self.I, self.O)] + [nn.Linear(self.O, self.O) for i in range(self.n_layers - 1)] ) def forward(self, positions, features, batch_indices): x = (features, positions, batch_indices) for i, layer in enumerate(self.layers): x_i, pos, b_ind = layer(*x) x_i = self.linear_layers[i](x_i) x = self.linear_transform[i](x[0]) x = x + x_i x = (x, pos, b_ind) return x[0] ## TangentConv benchmark segmentation class dMaSIFConv_seg(torch.nn.Module): def __init__(self, args, in_channels, out_channels, n_layers, radius=9.0): super(dMaSIFConv_seg, self).__init__() self.name = "dMaSIFConv_seg_keops" self.radius = radius self.I, self.O = in_channels, out_channels self.layers = nn.ModuleList( [dMaSIFConv(self.I, self.O, radius, self.O)] + [dMaSIFConv(self.O, self.O, radius, self.O) for i in range(n_layers - 1)] ) self.linear_layers = nn.ModuleList( [ nn.Sequential( nn.Linear(self.O, self.O), nn.ReLU(), nn.Linear(self.O, self.O) ) for i in range(n_layers) ] ) self.linear_transform = nn.ModuleList( [nn.Linear(self.I, self.O)] + [nn.Linear(self.O, self.O) for i in range(n_layers - 1)] ) def forward(self, features): # Lab: (B,), Pos: (N, 3), Batch: (N,) points, nuv, ranges = self.points, self.nuv, self.ranges x = features for i, layer in enumerate(self.layers): x_i = layer(points, nuv, x, ranges) x_i = self.linear_layers[i](x_i) x = self.linear_transform[i](x) x = x + x_i return x def load_mesh(self, xyz, triangles=None, normals=None, weights=None, batch=None): """Loads the geometry of a triangle mesh. Input arguments: - xyz, a point cloud encoded as an (N, 3) Tensor. - triangles, a connectivity matrix encoded as an (N, 3) integer tensor. - weights, importance weights for the orientation estimation, encoded as an (N, 1) Tensor. - radius, the scale used to estimate the local normals. - a batch vector, following PyTorch_Geometric's conventions. The routine updates the model attributes: - points, i.e. the point cloud itself, - nuv, a local oriented basis in R^3 for every point, - ranges, custom KeOps syntax to implement batch processing. """ # 1. Save the vertices for later use in the convolutions --------------- self.points = xyz self.batch = batch self.ranges = diagonal_ranges( batch ) # KeOps support for heterogeneous batch processing self.triangles = triangles self.normals = normals self.weights = weights # 2. Estimate the normals and tangent frame ---------------------------- # Normalize the scale: points = xyz / self.radius # Normals and local areas: if normals is None: normals, areas = mesh_normals_areas(points, triangles, 0.5, batch) tangent_bases = tangent_vectors(normals) # Tangent basis (N, 2, 3) # 3. Steer the tangent bases according to the gradient of "weights" ---- # 3.a) Encoding as KeOps LazyTensors: # Orientation scores: weights_j = LazyTensor(weights.view(1, -1, 1)) # (1, N, 1) # Vertices: x_i = LazyTensor(points[:, None, :]) # (N, 1, 3) x_j = LazyTensor(points[None, :, :]) # (1, N, 3) # Normals: n_i = LazyTensor(normals[:, None, :]) # (N, 1, 3) n_j = LazyTensor(normals[None, :, :]) # (1, N, 3) # Tangent basis: uv_i = LazyTensor(tangent_bases.view(-1, 1, 6)) # (N, 1, 6) # 3.b) Pseudo-geodesic window: # Pseudo-geodesic squared distance: rho2_ij = ((x_j - x_i) ** 2).sum(-1) * ((2 - (n_i | n_j)) ** 2) # (N, N, 1) # Gaussian window: window_ij = (-rho2_ij).exp() # (N, N, 1) # 3.c) Coordinates in the (u, v) basis - not oriented yet: X_ij = uv_i.matvecmult(x_j - x_i) # (N, N, 2) # 3.d) Local average in the tangent plane: orientation_weight_ij = window_ij * weights_j # (N, N, 1) orientation_vector_ij = orientation_weight_ij * X_ij # (N, N, 2) # Support for heterogeneous batch processing: orientation_vector_ij.ranges = self.ranges # Block-diagonal sparsity mask orientation_vector_i = orientation_vector_ij.sum(dim=1) # (N, 2) orientation_vector_i = ( orientation_vector_i + 1e-5 ) # Just in case someone's alone... # 3.e) Normalize stuff: orientation_vector_i = F.normalize(orientation_vector_i, p=2, dim=-1) #  (N, 2) ex_i, ey_i = ( orientation_vector_i[:, 0][:, None], orientation_vector_i[:, 1][:, None], ) # (N,1) # 3.f) Re-orient the (u,v) basis: uv_i = tangent_bases # (N, 2, 3) u_i, v_i = uv_i[:, 0, :], uv_i[:, 1, :] # (N, 3) tangent_bases = torch.cat( (ex_i * u_i + ey_i * v_i, -ey_i * u_i + ex_i * v_i), dim=1 ).contiguous() # (N, 6) # 4. Store the local 3D frame as an attribute -------------------------- self.nuv = torch.cat( (normals.view(-1, 1, 3), tangent_bases.view(-1, 2, 3)), dim=1 ) ================================================ FILE: benchmark_scripts/DGCNN_site.sh ================================================ # Load environment python -W ignore -u main_training.py --experiment_name DGCNN_site_1layer_k200 --batch_size 64 --embedding_layer DGCNN --site True --single_protein True --device cuda:0 --n_layers 1 --random_rotation True --k 200 python -W ignore -u main_training.py --experiment_name DGCNN_site_1layer_k100 --batch_size 64 --embedding_layer DGCNN --site True --single_protein True --device cuda:0 --n_layers 1 --random_rotation True --k 100 python -W ignore -u main_training.py --experiment_name DGCNN_site_3layer_k200 --batch_size 64 --embedding_layer DGCNN --site True --single_protein True --device cuda:0 --n_layers 3 --random_rotation True --k 200 python -W ignore -u main_training.py --experiment_name DGCNN_site_3layer_k100 --batch_size 64 --embedding_layer DGCNN --site True --single_protein True --device cuda:0 --n_layers 3 --random_rotation True --k 100 ================================================ FILE: benchmark_scripts/Pointnet_site.sh ================================================ # Load environment python -W ignore -u main_training.py --experiment_name PointNet_site_3layer_15A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 15.0 --n_layers 3 python -W ignore -u main_training.py --experiment_name PointNet_site_3layer_5A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 5.0 --n_layers 3 python -W ignore -u main_training.py --experiment_name PointNet_site_3layer_9A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 9.0 --n_layers 3 python -W ignore -u main_training.py --experiment_name PointNet_site_1layer_15A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 15.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name PointNet_site_1layer_5A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 5.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name PointNet_site_1layer_9A --batch_size 64 --embedding_layer PointNet++ --site True --single_protein True --device cuda:0 --random_rotation True --radius 9.0 --n_layers 1 ================================================ FILE: benchmark_scripts/dMaSIF_search.sh ================================================ # Load environment python -W ignore -u main_training.py --experiment_name dMaSIF_search_1layer_12A --batch_size 64 --embedding_layer dMaSIF --search True --device cuda:0 --random_rotation True --radius 12.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name dMaSIF_search_3layer_12A --batch_size 64 --embedding_layer dMaSIF --search True --device cuda:0 --random_rotation True --radius 12.0 --n_layers 3 ================================================ FILE: benchmark_scripts/dMaSIF_site.sh ================================================ # Load environment python -W ignore -u main_training.py --experiment_name dMaSIF_site_1layer_15A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 15.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name dMaSIF_site_1layer_5A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 5.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name dMaSIF_site_1layer_9A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 9.0 --n_layers 1 python -W ignore -u main_training.py --experiment_name dMaSIF_site_3layer_15A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 15.0 --n_layers 3 python -W ignore -u main_training.py --experiment_name dMaSIF_site_3layer_5A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 5.0 --n_layers 3 python -W ignore -u main_training.py --experiment_name dMaSIF_site_3layer_9A --batch_size 64 --embedding_layer dMaSIF --site True --single_protein True --random_rotation True --radius 9.0 --n_layers 3 ================================================ FILE: data.py ================================================ import torch from torch_geometric.data import InMemoryDataset, Data, DataLoader from torch_geometric.transforms import Compose import numpy as np from scipy.spatial.transform import Rotation import math import urllib.request import tarfile from pathlib import Path import requests from data_preprocessing.convert_pdb2npy import convert_pdbs from data_preprocessing.convert_ply2npy import convert_plys tensor = torch.FloatTensor inttensor = torch.LongTensor def numpy(x): return x.detach().cpu().numpy() def iface_valid_filter(protein_pair): labels1 = protein_pair.y_p1.reshape(-1) labels2 = protein_pair.y_p2.reshape(-1) valid1 = ( (torch.sum(labels1) < 0.75 * len(labels1)) and (torch.sum(labels1) > 30) and (torch.sum(labels1) > 0.01 * labels2.shape[0]) ) valid2 = ( (torch.sum(labels2) < 0.75 * len(labels2)) and (torch.sum(labels2) > 30) and (torch.sum(labels2) > 0.01 * labels1.shape[0]) ) return valid1 and valid2 class RandomRotationPairAtoms(object): r"""Randomly rotate a protein""" def __call__(self, data): R1 = tensor(Rotation.random().as_matrix()) R2 = tensor(Rotation.random().as_matrix()) data.atom_coords_p1 = torch.matmul(R1, data.atom_coords_p1.T).T data.xyz_p1 = torch.matmul(R1, data.xyz_p1.T).T data.normals_p1 = torch.matmul(R1, data.normals_p1.T).T data.atom_coords_p2 = torch.matmul(R2, data.atom_coords_p2.T).T data.xyz_p2 = torch.matmul(R2, data.xyz_p2.T).T data.normals_p2 = torch.matmul(R2, data.normals_p2.T).T data.rand_rot1 = R1 data.rand_rot2 = R2 return data def __repr__(self): return "{}()".format(self.__class__.__name__) class CenterPairAtoms(object): r"""Centers a protein""" def __call__(self, data): atom_center1 = data.atom_coords_p1.mean(dim=-2, keepdim=True) atom_center2 = data.atom_coords_p2.mean(dim=-2, keepdim=True) data.atom_coords_p1 = data.atom_coords_p1 - atom_center1 data.atom_coords_p2 = data.atom_coords_p2 - atom_center2 data.xyz_p1 = data.xyz_p1 - atom_center1 data.xyz_p2 = data.xyz_p2 - atom_center2 data.atom_center1 = atom_center1 data.atom_center2 = atom_center2 return data def __repr__(self): return "{}()".format(self.__class__.__name__) class NormalizeChemFeatures(object): r"""Centers a protein""" def __call__(self, data): pb_upper = 3.0 pb_lower = -3.0 chem_p1 = data.chemical_features_p1 chem_p2 = data.chemical_features_p2 pb_p1 = chem_p1[:, 0] pb_p2 = chem_p2[:, 0] hb_p1 = chem_p1[:, 1] hb_p2 = chem_p2[:, 1] hp_p1 = chem_p1[:, 2] hp_p2 = chem_p2[:, 2] # Normalize PB pb_p1 = torch.clamp(pb_p1, pb_lower, pb_upper) pb_p1 = (pb_p1 - pb_lower) / (pb_upper - pb_lower) pb_p1 = 2 * pb_p1 - 1 pb_p2 = torch.clamp(pb_p2, pb_lower, pb_upper) pb_p2 = (pb_p2 - pb_lower) / (pb_upper - pb_lower) pb_p2 = 2 * pb_p2 - 1 # Normalize HP hp_p1 = hp_p1 / 4.5 hp_p2 = hp_p2 / 4.5 data.chemical_features_p1 = torch.stack([pb_p1, hb_p1, hp_p1]).T data.chemical_features_p2 = torch.stack([pb_p2, hb_p2, hp_p2]).T return data def __repr__(self): return "{}()".format(self.__class__.__name__) def load_protein_npy(pdb_id, data_dir, center=False, single_pdb=False): """Loads a protein surface mesh and its features""" # Load the data, and read the connectivity information: triangles = ( None if single_pdb else inttensor(np.load(data_dir / (pdb_id + "_triangles.npy"))).T ) # Normalize the point cloud, as specified by the user: points = None if single_pdb else tensor(np.load(data_dir / (pdb_id + "_xyz.npy"))) center_location = None if single_pdb else torch.mean(points, axis=0, keepdims=True) atom_coords = tensor(np.load(data_dir / (pdb_id + "_atomxyz.npy"))) atom_types = tensor(np.load(data_dir / (pdb_id + "_atomtypes.npy"))) if center: points = points - center_location atom_coords = atom_coords - center_location # Interface labels iface_labels = ( None if single_pdb else tensor(np.load(data_dir / (pdb_id + "_iface_labels.npy")).reshape((-1, 1))) ) # Features chemical_features = ( None if single_pdb else tensor(np.load(data_dir / (pdb_id + "_features.npy"))) ) # Normals normals = ( None if single_pdb else tensor(np.load(data_dir / (pdb_id + "_normals.npy"))) ) protein_data = Data( xyz=points, face=triangles, chemical_features=chemical_features, y=iface_labels, normals=normals, center_location=center_location, num_nodes=None if single_pdb else points.shape[0], atom_coords=atom_coords, atom_types=atom_types, ) return protein_data class PairData(Data): def __init__( self, xyz_p1=None, xyz_p2=None, face_p1=None, face_p2=None, chemical_features_p1=None, chemical_features_p2=None, y_p1=None, y_p2=None, normals_p1=None, normals_p2=None, center_location_p1=None, center_location_p2=None, atom_coords_p1=None, atom_coords_p2=None, atom_types_p1=None, atom_types_p2=None, atom_center1=None, atom_center2=None, rand_rot1=None, rand_rot2=None, ): super().__init__() self.xyz_p1 = xyz_p1 self.xyz_p2 = xyz_p2 self.face_p1 = face_p1 self.face_p2 = face_p2 self.chemical_features_p1 = chemical_features_p1 self.chemical_features_p2 = chemical_features_p2 self.y_p1 = y_p1 self.y_p2 = y_p2 self.normals_p1 = normals_p1 self.normals_p2 = normals_p2 self.center_location_p1 = center_location_p1 self.center_location_p2 = center_location_p2 self.atom_coords_p1 = atom_coords_p1 self.atom_coords_p2 = atom_coords_p2 self.atom_types_p1 = atom_types_p1 self.atom_types_p2 = atom_types_p2 self.atom_center1 = atom_center1 self.atom_center2 = atom_center2 self.rand_rot1 = rand_rot1 self.rand_rot2 = rand_rot2 def __inc__(self, key, value): if key == "face_p1": return self.xyz_p1.size(0) if key == "face_p2": return self.xyz_p2.size(0) else: return super(PairData, self).__inc__(key, value) def __cat_dim__(self, key, value): if ("index" in key) or ("face" in key): return 1 else: return 0 def load_protein_pair(pdb_id, data_dir,single_pdb=False): """Loads a protein surface mesh and its features""" pspl = pdb_id.split("_") p1_id = pspl[0] + "_" + pspl[1] p2_id = pspl[0] + "_" + pspl[2] p1 = load_protein_npy(p1_id, data_dir, center=False,single_pdb=single_pdb) p2 = load_protein_npy(p2_id, data_dir, center=False,single_pdb=single_pdb) # pdist = ((p1['xyz'][:,None,:]-p2['xyz'][None,:,:])**2).sum(-1).sqrt() # pdist = pdist<2.0 # y_p1 = (pdist.sum(1)>0).to(torch.float).reshape(-1,1) # y_p2 = (pdist.sum(0)>0).to(torch.float).reshape(-1,1) y_p1 = p1["y"] y_p2 = p2["y"] protein_pair_data = PairData( xyz_p1=p1["xyz"], xyz_p2=p2["xyz"], face_p1=p1["face"], face_p2=p2["face"], chemical_features_p1=p1["chemical_features"], chemical_features_p2=p2["chemical_features"], y_p1=y_p1, y_p2=y_p2, normals_p1=p1["normals"], normals_p2=p2["normals"], center_location_p1=p1["center_location"], center_location_p2=p2["center_location"], atom_coords_p1=p1["atom_coords"], atom_coords_p2=p2["atom_coords"], atom_types_p1=p1["atom_types"], atom_types_p2=p2["atom_types"], ) return protein_pair_data class ProteinPairsSurfaces(InMemoryDataset): url = "" def __init__(self, root, ppi=False, train=True, transform=None, pre_transform=None): self.ppi = ppi super(ProteinPairsSurfaces, self).__init__(root, transform, pre_transform) path = self.processed_paths[0] if train else self.processed_paths[1] self.data, self.slices = torch.load(path) @property def raw_file_names(self): return "masif_site_masif_search_pdbs_and_ply_files.tar.gz" @property def processed_file_names(self): if not self.ppi: file_names = [ "training_pairs_data.pt", "testing_pairs_data.pt", "training_pairs_data_ids.npy", "testing_pairs_data_ids.npy", ] else: file_names = [ "training_pairs_data_ppi.pt", "testing_pairs_data_ppi.pt", "training_pairs_data_ids_ppi.npy", "testing_pairs_data_ids_ppi.npy", ] return file_names def download(self): url = 'https://zenodo.org/record/2625420/files/masif_site_masif_search_pdbs_and_ply_files.tar.gz' target_path = self.raw_paths[0] response = requests.get(url, stream=True) if response.status_code == 200: with open(target_path, 'wb') as f: f.write(response.raw.read()) #raise RuntimeError( # "Dataset not found. Please download {} from {} and move it to {}".format( # self.raw_file_names, self.url, self.raw_dir # ) #) def process(self): pdb_dir = Path(self.root) / "raw" / "01-benchmark_pdbs" surf_dir = Path(self.root) / "raw" / "01-benchmark_surfaces" protein_dir = Path(self.root) / "raw" / "01-benchmark_surfaces_npy" lists_dir = Path('./lists') # Untar surface files if not (pdb_dir.exists() and surf_dir.exists()): tar = tarfile.open(self.raw_paths[0]) tar.extractall(self.raw_dir) tar.close() if not protein_dir.exists(): protein_dir.mkdir(parents=False, exist_ok=False) convert_plys(surf_dir,protein_dir) convert_pdbs(pdb_dir,protein_dir) with open(lists_dir / "training.txt") as f_tr, open( lists_dir / "testing.txt" ) as f_ts: training_list = sorted(f_tr.read().splitlines()) testing_list = sorted(f_ts.read().splitlines()) with open(lists_dir / "training_ppi.txt") as f_tr, open( lists_dir / "testing_ppi.txt" ) as f_ts: training_pairs_list = sorted(f_tr.read().splitlines()) testing_pairs_list = sorted(f_ts.read().splitlines()) pairs_list = sorted(training_pairs_list + testing_pairs_list) if not self.ppi: training_pairs_list = [] for p in pairs_list: pspl = p.split("_") p1 = pspl[0] + "_" + pspl[1] p2 = pspl[0] + "_" + pspl[2] if p1 in training_list: training_pairs_list.append(p) if p2 in training_list: training_pairs_list.append(pspl[0] + "_" + pspl[2] + "_" + pspl[1]) testing_pairs_list = [] for p in pairs_list: pspl = p.split("_") p1 = pspl[0] + "_" + pspl[1] p2 = pspl[0] + "_" + pspl[2] if p1 in testing_list: testing_pairs_list.append(p) if p2 in testing_list: testing_pairs_list.append(pspl[0] + "_" + pspl[2] + "_" + pspl[1]) # # Read data into huge `Data` list. training_pairs_data = [] training_pairs_data_ids = [] for p in training_pairs_list: try: protein_pair = load_protein_pair(p, protein_dir) except FileNotFoundError: continue training_pairs_data.append(protein_pair) training_pairs_data_ids.append(p) testing_pairs_data = [] testing_pairs_data_ids = [] for p in testing_pairs_list: try: protein_pair = load_protein_pair(p, protein_dir) except FileNotFoundError: continue testing_pairs_data.append(protein_pair) testing_pairs_data_ids.append(p) if self.pre_filter is not None: training_pairs_data = [ data for data in training_pairs_data if self.pre_filter(data) ] testing_pairs_data = [ data for data in testing_pairs_data if self.pre_filter(data) ] if self.pre_transform is not None: training_pairs_data = [ self.pre_transform(data) for data in training_pairs_data ] testing_pairs_data = [ self.pre_transform(data) for data in testing_pairs_data ] training_pairs_data, training_pairs_slices = self.collate(training_pairs_data) torch.save( (training_pairs_data, training_pairs_slices), self.processed_paths[0] ) np.save(self.processed_paths[2], training_pairs_data_ids) testing_pairs_data, testing_pairs_slices = self.collate(testing_pairs_data) torch.save((testing_pairs_data, testing_pairs_slices), self.processed_paths[1]) np.save(self.processed_paths[3], testing_pairs_data_ids) ================================================ FILE: data_analysis/analyse_atomnet.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python37764bitvenvvenv0f8ab664edda4e43b2faa48ba983dc72", "display_name": "Python 3.7.7 64-bit ('venv': venv)" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from sklearn.metrics import mean_squared_error" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.8289113443652403\n0.16479157\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-11-14T13:07:27.340743\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAASMAAAEKCAYAAABZgzPTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABz20lEQVR4nO2deXxU5fX/308ymSSThCSThLCFJCQBDIoRIyCLyGaltdBvKy6tFW39oq1aqrZVLK3V2mpr1aK1Vb62Frq44E8rpVILiMgiexElEpKQhBAgZCeZmWQyk+f3x11yZzKTPSTIfb9eeSW5c9eZueee5zznfI6QUmJiYmIy0IQM9AmYmJiYgGmMTExMBgmmMTIxMRkUmMbIxMRkUGAaIxMTk0GBaYxMTEwGBQNqjIQQfxJCnBFCfBrkdSGEeE4IUSiEOCSEmGR4bYkQokD9WXLuztrExKQ/GGjP6M/AtR28vgDIUn+WAn8AEELYgUeAKcBk4BEhRHy/nqmJiUm/MqDGSEr5IVDTwSqLgDVSYRcQJ4QYDnwB2CilrJFS1gIb6diomZiYDHIsA30CnTASKDP8f0JdFmx5O4QQS1G8KqKioi4fP358/5ypiYkJ+/fvr5JSJvVk28FujHqNlHIVsAogNzdX7tu3b4DPyMTk84sQorSn2w50zKgzyoEUw/+j1GXBlpuYmJynDHZjtA64VZ1VmwrUSylPAe8B1wgh4tXA9TXqMhMTk/OUAR2mCSFeBa4GEoUQJ1BmyMIApJQvAu8CXwQKASdwu/pajRDi58BedVePSSk7CoSbmJj0MzUON6HR9uSebj+gxkhKeXMnr0vg7iCv/Qn4U3+cl4mJSfdZu6+M0Gj7qJ5uP9iHaSYmJucJi3NT8DbWnOjp9qYxMjEx6RPsUVa8jTUVPd3eNEYmJiaDAtMYmZiYdIkah5uXthZR43D3y/5NY2RiYtIlQ7N2XxlPbDjC2n1lQdfpDZ/7DGwTE5PO0QwNwJ2zMgKuszg3xed3X2MaIxMTky4ZGnuUNaihgt7nGZnDNBOTAPR3fGSwoRkae5TVZ3l33gczz8jEpB/or/jI+WbkuvM+zMtOptXtqu/pscxhmolJAPorPtKV2Mxgwv99qHG4WbuvjMW5Ke28qNf3lhFijYzt6bFMY2RiEoDO4iM9pb+DwH2N//vQkTE9XN5jpwgwh2kmJueUYLGZ84Ur0uxkJEVxRZq93WsPXDMO6Wlp6um+TWNkYmISFP8Y1/PvF1BU6eD59wvarbv1aCXCEhbR02OZwzQTE5N2aLEhp9vLys2K4blzVgYrrssG8tTfvrjc3l4d0/SMTC5ozrfZrb4m2PW3xYYkyxeM12NcGUnRvHL7ZDKSogPsTfbqXEzPyOSC5nyb3eot/rNh/tdf43CzemcxrpZWls3NZMm09IDxLWW9EkDq60Rae2dOTGNkckFzvs1u9QTNAM3LTubx9Xlsya8EFOPjf/2rdxazcnMhALPHBW/ysXZfmT58s1kt3Dkrg8ykKJCytafnaRojkwua/prCH0xo3s+uY9Vsya9k9rgk3fj4X7+rRbElKfGRbMmvZPXOEmzWUOZlJ7Mpr0L3qBbnpuB0e3G5PTjdXmocbla88ykI0ePQz0BrYF8LrARCgZellE/6vf4sMFv91wYMlVLGqa95gU/U145LKReek5M2MTlHdJRg2J11FcPhweVuZeKoOJZMSwu+P6nEfZJirMweN5R3DpZTUu3kw6OV7Ciqxun2cN/8cdijrNw3fywvbS3iiQ1HsFlDiY/sXbrCgAWwhRChwAsoLayzgZuFED4heinlfVLKHCllDvA88JbhZZf2mmmITM4Huhss704pRkfr2qOs2KwWVm07hs0aCuBzHkWVjdz+yh6KKhv1uM+B4/XsKKqipNpJRlIUE0ZqidXCZ9+Lc1P0AHelo8cpRsDAekaTgUIp5TEAIcRrKO2s84KsfzNK9xATk/OS7gbLuxrPqnG4cbq9LJubGXRd476M57E4N4Wla/ZRVOkA8nj6hhx1C8mssUN5/v0CVlyXTbzNSoI6PDMeV/PGAGxh528AO1CL6imBVhRCpALpwPuGxRFCiH2AB3hSSvmPfjpPE5M+obvB8q7Gs7Rg8vIF44MOv4z70o4/LzuZB944SFGlg4ykKFZcl409ysqSaWms3VdGWmIUr9w+OegQUAt2O90ebFYLlY29S484XwLYNwFvSimNWVWpUspyIcQY4H0hxCdSyiL/DYUQS4GlAKNHjz43Z2tiEoD+rHdzur043R5qHO6AMiCBjMm6gyf1gPbTN+Rgj7JS43Bz798P+MSHgnl0WrC71tECwKS6Uv7Vi+sYSGPUnRbVN+HXP01KWa7+PiaE+AC4DGhnjKSUq4BVALm5ub3LyjIxGQA6C2Qry6Q+JX/f/HEUVTby+HolU3pTXoWPMdE8mslp8Sybm8XCnBGs3lkMCFxuLzuKqgHYX1pHjcMd1KNrcnsA+KS8jrHrX+fv779MbM/ljAbUGO0FsoQQ6ShG6Cbg6/4rCSHGA/HAR4Zl8YBTStkshEgEpgO/PidnbWJyjuks1lTjcLO/tE79TwkwP/LOp2wvrKbF+ynP3TwJUIZlL20t0j2aPSW1jB8Ww6a8Ct2QzchMACAtwcb2wirW7ivjzlkZPsfVjGN+RSORzU6+/+eVzNq3sdfXOWDGSErpEULcA7yHMrX/JynlYSHEY8A+KeU6ddWbgNfU7rIaFwEvCSFaUWYEn5RSBgt8m5ic13SmKbR6ZwnbC6uYkZnAkmlpAGQPj2V7YTXZw2P14aE2Db9sbibxtjBqnS18WFDFW9+djtPtAQQLc0awKa/CJ6/IH804rhjl5pnXfsjI06UAHEy7BJpcPb7OgW5v/S7wrt+yn/r9/7MA2+0ELunXkzMxOYd0NBTrXFNIeU5fnhqvb3vj5BQKzjRw4+Q2Y2IMXNc6WviwoJIH5o/lgTcOsuK6bL3eLGOW8js+1xrwnBbnpnDRO39j5o+eRLhceEUIGxbcwv7blsH3buzxe3C+BLBNTD7XGLOktWByMPw9pYU5Izl0op6FOSMBxbBpZR9Tx1ToxkVj3cGTrNlVyvIF43nrv+Vsya+kxXuYmVmJhrKQEnYdq2Z3cQ1Ot5f75o+lxuHm7a2fccsrv+CqN9cC0JqczLp7H6Nk8ixuyRnJz3vR3to0RiYmg4DFuSl6uYYWpwmGv6e0Ka+CLfmVTBx1Eps1lOpGN1vyK5mekaDHiYz5RcvmZrJ8wXjmZSdT3dhMi1eSPTxG97aMsiEKiuf1/t//zZwHv0N47Ull8ezZhKxZw5miZlZuOILNaulVe2vTGJmYDALsUVaeviHHJ4mwq2jrO90enthwhFS7DYDcNDvrDpazcnMh1Y3NRFotPpX4L20tYtW2Yj2DOiE6nMW5KerMGkxJtzN1jJ0l09LhhRf42g9+iGhyIS0WXA/8kL/Ou5Xr44eyOLftPO7qxXtgGiMTk0FCT/OQtO1qHG4OnajXc4eWTEtTZT4g71QD2wurWL5gPKCUg8zLVlqcaTEh7dhLpqVjs1qU5a3NcNs34M03lXm6kSMRr7zCX6xjeGLDEWRYWLvZtp5iGiMTk0FOZ3lGxtfvnZPF8RonS65UsqgX5oxoV3UfKFXAKDOiV+cf+QRuvBGKlPS9ljlzCfvrX2D4cBardW3+5SG9aeJoGiMTk0FOZ3lG2utOt5f1h05SVOng5//KU+vN2rbRAtmBkhh9ZEaOnGHs668w8+WnsLS48YSE8tvpNxOz4qfcOXw4ENiL620TR9MYmZgMYmocbqob3czITNCHVf6va0WyIPU6s6euv5S9JTUB40+BDIm23vxREfz0TytI364kMZ6JTeLeBfdRlXslayendniuvW3iaGpgm5gMYtbuK2PVtmNsL6xmU54yUWWUItGKZG1WC0umpbN8wXhW3ZrrY4i6Iltij7Jyp62GMfNm6Ibo+JRZnHp/B7Zr5rLq1txONZXWHTxpNnE0ubDpjgjZ+YCxrkwTRgPB4twUahxuHnjjoC4daxxyaR7PsxvzWbm5kL/uKmVEXCS7i2uADmRLpIRnn4Xly8HthrAwePxxRv/gB0S7PExtCCHe1pX3tXeln6ZnZHLes3pnCU9sOKLPHA12OhNZ0xIWH1+vVDgpXk+aLqBvlI4N3BRSqU8rq3Wxu7iG6RkJujRsO+rq4CtfgQceUAxRaip88AH86EcQEtItgbcl09LxmkmPJhc20u/34KazgLSxN9nqnSWs3FygZ0H7e0KBWDItjVqHmy35Z5g9bijxUVZ1KBfqe7zdu5XZslKltoxFi+CVVyA+Xl+lOxpM9iirmfRocmFjzIs5H9CGXpq34m9UtN5kAC5VpkP7bQw++w9Pjf+PjI+krNbFyPhIFuemYLOGtr0/UsLTT8PDD0NLC1it8OST8P3vg/CVle1O7pM5tW9ywXO+dfjQNKk1IfuOzl3TpDb2JPPv9rqtoJLLUxVvRpMCCerR1NTAN78J76r16enp8NprMHlyt64hUJyut1P7ZszIxGQAWJybwrK5Wbo6YzCWTEtj+YLxujQI+HZ7nT0uie2F1azcXIjL3crscUnMy072iSVp62/98ztw6aVthuhrX4ODB7ttiIznYIwlLc5NMWNGJiYd0dezbR0Nj7qz/0Mn6tiSX6k3QQy0b3+vz5hXtGRaOoDe2RVEwEr9xZePIudvLzL56d+CxwMREfCb38B3v9tuWNbZter7DOB5mTEjE5NO6OsW1v778w8yd3Uf/g0VOztX47S+UXxfO2ZRZSOHTtT5JkfW1GD/+teZ8t57AHjHZPD28meYc/O12DswRP5DQf/zCTQ0NmNGJiad0NctrNvvr/1snn+tV6COrNo+NKPSWcshzYClJdiobmxuF/zWpER0z+jDD+Hmm+GkIvnR/LXFfG/ud3mv0MHyTmRK/OVGuvLemeUgJhckfTn06u6+jFXyL20tYmHOSJ/ZvKLKRr0X2baCKrYXVvHqnuOUVDtxur36zJa/MdCE8pfOTG9ftBpl5Yo0O/aoMEqqnazaVkxCdLjPPnQDN2kkPP44/Oxn4PVCZCT89rf8edxc3ttwpJ03Fuh96EoKgT+Lc1O424wZmVxodGfo5b+uv/HpqIq9o5sx2Dk8vj5PrxHLHh7D9kKlM+vscUmADLiNUVRfkfso5o19ZT7Frk9u+IwaRwsj4yK4/vJR7QyKPcrKnRNi4atfhk2blIXjxsHatXDJJT6V9oGuyV9tsrtD2vM6ZiSEuBZYiSLI/7KU8km/128DnqKthdHvpJQvq68tAVaoyx+XUq4+JydtMijoztDLf922KnelzMIVYGjUFWNn1JR+duNRQLJkWrpP0mK8zUqkNRQQSjKiU9Ec8i96XbuvjO2FVcwel8S9c7I4Ve+iqNLh48UINcaTPCQCmzXArfvBB8qw7PRpAJpv/gZ/uW05Xx2ThZ3OUyC6ozbZHwyYMRJChAIvAPNRusnuFUKsC9Dl43Up5T1+29pRWl3nogzU96vb1p6DUzcZBHQnt8h/3TZlxLbgrH831o6Mnf9wxlgrps2MaUmLoCRlalPg7eI6huNpxnHr0TMUVTqYnpHAxFFx+jq//OolPL4+j6zkGF9D2dqqDMsee0wZlkVFwe9+x5/TZ/LEhiN4wyM6fa+0a1pxXTZTxwTuCtLfDKRnNBkolFIeAxBCvAYsArrScugLwEYpZY267UbgWuDVfjpXk88RxpiPggw85AlyAxu9JoAt+ZXMyEzg8tR4vZjVKB+rGSun2wtIls3NCtiz3tXSyqoPj7H0qjEsXzBeN5ZaYqSWmV3jcLf1vT9zBm66CbZsUXaWnQ1vvgkXXRRQAC0YfT3j2BMG0hiNBIzVdyeAKQHW+5oQ4irgKHCflLIsyLYjAx3EbG9tEgx7lLXLU/FG/L0mp9uLy93WeT2QsZo9LgmX28OqbcV6fzP/6fO0BEW7OjIsRDeWPmUchvO+c1YGvP8+fP3rUKGGab71LXjhBSWPiI5LR/yX9fWMY08Y7AHsfwKvqp1j7wRWA3O6swOzvbVJd+kseF3rdLPrWDXzspOJt1n15EUNLRlxXnYy6w6Ws2xulo8e9fbCan3Y9sSGI0xOiyctwaYHubXtg3pnXi88+ij84hfKEC06Gl58Eb7xjaDXFMjz8V820CU1A2mMygGjGR5FW6AaACllteHfl2lrYV0OXO237Qd9foYmFySdDVk0iQ/IY+qYBD33p6Tayf7SOpZMQ+/gunJzoR6PUko6lExpxVCdZNLoWPaUKKHO2eOSOu2ZxunTSqX9hx8CUJk+jrB/vEXcxOx2q3bm+ShxKq9ekjLQWlADWZu2F8gSQqQLIawobazXGVcQQgw3/LsQ+Ez9+z3gGiFEvBAiHrhGXWZi0imd6Qktzk3pMNFvxXXZ+qyXlqT4x9uuYEZmItsLq/jeq/+lqLKxXQKjMiwcx33zx/L6nuOs3FzA6fpmAFLiI5k4qhORxP/8By65RDdEf825lulffZJXKiwBr8dYP2b0srR1lYLdUFZuLuySXlFn9DYDe8CMkZTSA9yDYkQ+A96QUh4WQjwmhFiorvY9IcRhIcTHwPeA29Rta4Cfoxi0vcBjWjDbxCQQ/lKtXRUMC7SfTXkVPH1DDntLanTJ14ykaLKHxwCwvbCKx9fn6a8F8jg+PqFIRSfGhDM9I4ERcRHBjYLHo6gwXnstVFXBkCE0/OXvVP76t3znC9louUv+22pGVWvkGOjaOzO83eG8zsCWUr4LvOu37KeGv5cDy4Ns+yfgT/16giaDit5kXRvrx7QK+GA3YEfDNO21N/aV8dT1l/rcyJrMR1qCjXvnZDF1TELAWbPFuSlcOiqO3cU1TE1PICHayhMbjpCRFNVedL+8nJbrFxO26yPl/0mTYO1aYsaM4T7DfgPpOWne0Etbi/Tr8R+u9aX8ipmBbXLB0Lvp57b6sUCV8P51ZBDYWC3OTdEzo59/v0DPJ9KGSNMzEthRVM3ekpqghmzXsWpWXJdNQnRbjZqWbLgpry3/qOHtfxJ2261EnK0D4JOv3solr/6fIoZmQKt1C2aoA+lkd4dzpTFuGiOT84aeTD9rN5JWP2bsPW8UBdN7hqmzYtrUujGzWpP0WHVrLo+8c5isodF67EXr0jEjMyFoHtG87GS2FVSxJb+SiaNOct/8sYGTDVta4Mc/JuappwBoioph60O/4or7vt3OEGl0ZKh76/109SFwXg/TTEy6Q09uKv8byThk0fZlLOswZh9rBgbg0Il67p2TxfPvF7DiumxmZiXyxIYjbD5yhlW35vqUUszMSvLxIIzncHlqHNsLq9A8tXY3elkZLF6s6FMDZ8ZPxPr2/+ML4zM7vM7+zBPq6r572zfNNEYmn2v89aaDiYIZu65qwe552ck43V72l9awJb+S4zVOtXA1j6dvyOHVPccpqnTw0398yt/+dypP35DD6p3F7bSt/Y+pxXfaSYasWwe33Qa1alXT/fcz9MknldZBndCRoTa2PspIig64Tk/3bWRTXkWv+qaZsrMmn2s0vemVmwt4cWsRD7xxUJdlDYbmrWzKq+C++WN57uZJLF8wnqeuv5TZ45JYcV029igr10wYBsCEkbHtjhVsps5fDnbl5gKiRSuRD/5A6c5RW0trfDxvP/YHnr32Tmrcvc/TNbY+6iytIRhd2c6UnTUx6QTNI/nwaCU7iqqBPL3GqzNJVf91Xrl9MkWVjdz+yh7unZPVViNm2Nbp9lDtcPPLf+XpM2yB1BIX56YQfeoENz74TSwH9gNwesJlbHrkOVbsr4cA7YV6Ekw2qgj0dBLAqHSgeXb+xz+vJURMTM4FmjcyLztZH65A2w1W3dhMwZlGfRhjLKT1L3IFwb6SGtWo4VOdrx1L8Y7aatOCqSXa//MvvnHX7VBfjxSCgzcvJfX3z/BFi4XKuGK0LrJGeqK9ZGx9FJ/rO3TsKsY6vI6O3xtMY2QyYJyLKWPjMeJtVqaOSdBbNWs3j6bG2OI9zMysRB/RNa3IFaTeBiglPpIp6XbdqPmzODeFbQWVbC+sZkp6PFr5h37Dut2U33E3l7y1RtkgIQHx979z2TXX6OcczPsIFPPqjrfT26l9oF3xrtFrMjWwTc5LOruJ+sJYGZMdbdbQgMe7f/5YwkIFWUOjfV4PdOO/c/AkJdVOModGdxgMvjzVrvYyE6zcXKAX04aVljDnp3dzSWm+suLMmfD66zC8rfLJX3Gxs2vv74r7zgpqjV6TObVvcl7S2U3UFxo7mrSHS828drq9VDc288t3P+Pg8Vr2lNSydGY6U8ckMC87mYTocJ/sZGMy4X3zxzFr7FB++ObH3DsnK6gsh7GDx7zsZA6dqOPeOVncfHwPs77zEOFOB61C0Pyj5UT+4jEIDW33vgRTXOxMQrc/6OxzMg5rf2gGsE3OR7oig2r8rdGVG1BbR8vnibSGGApDC3zW1TSnwTcOsnpniU986M5ZGboK49ajZ9hbYmlnLFfvLGZLfiXTMxJ0Q7bzcDk/+MdKrln3dwCc8QnUvbyafyaMZ3GTF3tUmzHSzvveOVm0eGW7LiDzspN1+RI4N6JoXR3amQFsk88twW4CrYuG0+3hvvnjgPYGqq3VTpZP8Fib7XK1tIKURFotLMwZoXfhaDtGiW60YiMtlNe61GltrdeYCGIslddz0+zYo6zcGNfE1975MYmFquDE7NnYXn2VvxxpDGhEtPNWOsUqsSxjFxBNtlbLdRoMomh9hWmMTM5DlBve1dKqJyc+/NYhdhfXUu1w8/AXL9K1ejRJWc2zUHSF0lm9U5mtWjItDXuUlfhcq0+Qdl9JmwhEvcvDml2lRISFglDqz2aNTdJLPHxnkqQupsZrrxF3xx3gcEBIiNI66OGHITSUxdHxQHsjov1/RZqdFq8ke3hMu9QB/yFcTzyic1Vv1h1MY2Ry3tBWZzYCmzUUp9ujB3p3FytZy4fL632GaCs3F3LoRL1PIFhJNizU96vsS5F+3XWsmomj4thRVE1ago1LRw3hg6NV1Ls85J2qZ3uhMmQ78fpBSmucvH+kgt3FtXqAfOXmQlbMScN+3z3wf/8HQGvyMNY//Awzvv017H7xIeN1GQtZX9paxPbCKmZmJfoYC3uUladvyPExgD0xLINB89of0xiZDGqMN5rxBlqcm8KLHxQxIzOBe+dkkTU0mrxTDTy6aIK+3ozMRKZnJOhehLYPpcxD6cRR63CzcnMpt05NZfa4JLWINVb/Oz0xinqXR8+8Xr2jhHc+Lqe0xqmeoTZsUzyw8KICvnTnV6HkqLL4mmv4y3d/ziMfVfp0cfXXyQ5WL9dfYvqDcXhnGiOTQY2/AdJ+r95Zwqptx9S1jvLczZdhj7Kq9V4eXXXxhtxR2KPCGBEboc9y7TpWzZIr0/j5v/KIsiqeyrGqRp67eZJurFxuLy1e6aNLZI+yUlbrpN7lAWBGZgKPLrpYjzdZX/s7N333O0S4m2gNCWXPt+9j7NM/58shIdTYSnzkXYPJwGp0tTtJsBSEzuhLHaO+Qkh54WjU5+bmyn379g30aZgEQJu9Msp1aMsDDUGe3ZjvM9TSPBetDmt6RgITRsbyxr7j1Dk9RIaF4GppJSMpiqJKB3GRYdS5Whg2JJyocAs/+VI2+RUNepa2JiWybG4WNmuornV0RZqdX/37M0Dwy69eouQaOZ1wzz3wyivKOcclsfGRlTx4eghLZ46h4EwDKfE21uwqZenMdD19wHg93RlqDaZ4j39C5NBhw094Gqp75G6ZnpHJoMAo16E1QgTfXB9f8TPB0pnpgCDv1Fl9hmlLfiWpdhs7iqo5XuNsZ4ieuv5S9pbUsPtYNe/nV+LxtlJU6WD1RyW617Qlv5KU+EiSYsLVeFQNf999nNIaJ9MzErg0JZ5VHx7jkXcO87ucCOJuvRk+U2bL3h+TS/6vn+fGaydxcmexniSptSEKlEagXX9/ZlH3F/7DzfM26bEL7a3vB+4APEAl8C0pZan6mhf4RF31uJRyISb9Ql8+iTsqTq12uDl4XJkRM+bW+IufaUqLmje07mA52SOG0OT2MCXdjqvFCzVQVusCIGtoNBFhoewpqeWZjfk8uuhifv+B4lVVOVoYFRdJvauFpTPTuXHyaJzuT9hdXKNvHx0RoseIdhRV0+JtBWDY269hu+dFaG5Chlr48Fv38/H1t7PwslGs3lnC/tJaSqqdPkbwijQ7YaGinbzsQMdwevoZ+5/3eSk728X21v8FcqWUTiHEd1BaFd2ovuaSUuacy3O+UOnLmZdg+7JHWUmIsrKnRMmKTjA8/Y3iZ063MoUfG2lRNYb26YbJ2LvMyKHys0waHQcoPcu+9cpePe4zNNrKiToXJ+pchIUKEqLD0RIlraECt1fS2NTqs7+xUYJvbVzJtQc2AlA+JIlffPMR3o1OY3l4GOsOlutDSM1gvr6njI9P1Oqzb/7trfvL2+mqkenpZ+zfKLI3DOr21lLKLYb1dwG3nNMzNAH69qnd0b60hET/anXjUK3FqxiKepdHj/9obYMczR4amz3Uu1qYnpHAkdMNHCo/y4jYCH1foQLDTBikJ0WTniTZXVzLybomnthwhKUzx1DV6FaF1JT5Moki/pVVWcK377uL9GrFAdiYOYUHvnQf104fx/KhMYxLjuG+Nw4CMCU9nomj4lh38KQh2A4ZSVFckWbX5W+BfosBddXI9MVnfD7Lzna1vbXGt4ENhv8jhBD7UIZwT0op/xFoI7O9de/py6d2Z/vyr1bXVApT7DbWfFSq9xabOCqWqel2pme08unJepa99l99WAXwXl4FqXYlTnOyvokZmYkUnGmgoamtDfWwIeGMS46hqcXDkdMNlNW6mJ6RwI2TlRsyylpJaY2LepeHlLgIvrTnX3x/3e+I8LbQEhLKL2Z/m9emLKLJK4kIU26lR9YdptbZgj0qjKljEvS21TdcPorCykbOnG2mqNLBD9/8WDd20H5qv6+Gxl01Mn3xGS/OvQC6gwghbgFygVmGxalSynIhxBjgfSHEJ1LKIv9tzfbWgxdlBq0tEzrQU1yb2Yq3KdKrpVXKDRwqYNW2YlLiI3UjlJZgwx5l5cDxOupdHg6Vn9WP9dGxaqKsFhqavIQIaJUQFhrCml2lPufkaZWsO1ju48ksGB3JN//8BNP2bgKgLHYov/nWY5waewnZrZIDx+vYkn+GsloXiy4dTkNzC88szmFiShzrD52iqNJBemIUX5gwTG9JpHl0bRXvbdK4gJ6GYHwvesJgCnZ3xqBubw0ghJgH/BiYJaVs1pZLKcvV38eEEB8AlwHtjJHJ4MWYCW3UyNEUFlfvLCbFbiPVbqO0xklspEXxUuIjUUdrhFtCiI20MDI2gotHxXHk1FnstjAamloYGRdJtcNNQ7OXsloXdpuSUxQWAs1eiImwkBhlpcoQ69hdXEPeqbOEhUBLK1zVWMYjP3ucYZXKV/P9CTP5/ry7OWuNBrUttdEgKsH3FvIrGpiYEsfc8UMZHtvAiuuydR0lrbW1FpvSBNme2HAEm5r3pOko9UdAu79SA87nYZre3hrFCN0EfN24ghDiMuAl4Fop5RnD8njAKaVsFkIkAtNRgtsmgxT/G0ATo186M51Iw9DMX2ERYOlVYyioaKCqoYlPXA0kRls5WdcEwMk6J84WSXS4hzf2+Y4QSmoUAxEeKmj2SmqcyhCtWR2p5Z1qaHeeIUBDkwek5JaDG/jJ5v8j3NtCS2gYv1lwJy9lfwGEIHt4DCfqnJx1eUmKCSc1IYrs4THcOHm0ngS5emcxq7YVs2xuJvE2q8/1a9pKWhpDoOHUvOzkgLlX3X2v/emvUpDztjuIlNIjhNDaW4cCf9LaWwP7pJTrgKeAaGCtEALapvAvAl4SQrSifH+e9JuFMxkEBCrl0ATDtLyi5QvGB2x2uCW/krQEG5PT7Lz36WlKa5xMHDmEeFsYWUNj+G+Z8p1v8ijeRcXZpnbHDwW8QLPqRiVFWal0uLGFCZwtgUfsrUBMs4MnNjzHdfk7ACiJG86Kr/+U7TEp+hDP6fZy1uUlIymK3NR4Vm0rZmZWIhlJ0XqHkf2ldQDUOltY/OJOPUZkND7GPm7G90GrTwuUe9UZnRmb/koj6G13kMHe3npekO12Apf079mZdIdAT2P/Ug5jtbm/Lo9xe+O6FWebcLW0EmERegzow4JKsofHkH+6QR+ueVrbn5PX8LdFQK1LGY7F2cJx1rc3XgCXnCrghXeeZHS9IsuzbvxVPHztPbhtNvAqhkgAYxKjSB4SzrjkISAEy+Zm+hiWtfvK2F5YRUZSFPmnz1JU6cAeFcYVaXafxpAdGQ5/5YGu0lUxtJ4SzPPqV89ICGHv6HUpZU1Hr5tcOARSIDT2BNOqzVfvVGq01h08yZb8Sj3fxigPe9/8sTx9Qw5f/f0OSqqdRFhCaDJYm9Nnmzl9tjnYqQTEI9E7XJ+sbyIxKowqR0vbClJy2/5/8vCWP2Ft9dAUGsbP5t3Ja5cqwzKjZZPA++oQUlMLWL5gPK/vKWPVtmNUN7q56+oM3aAmRlv1uNIzG4+qTRyVxpArrss2dBP5jEhriE/32vvmj+3eB0H/B62DGdD+9oz2o7VEgNFArfp3HHAcSO/pgU36l3Ndv+T/NDYOw4xaQlqsZEp6PFPS7bqSocutJCG61GLStfvKuCorkZLq44xNjuJQuRLf0XJ+tN8AlpDAnlFHuDxewkIFLV7JkKZGfv3uSq4t+AiAIvtI7l70EEeGBv56W1DySTQDkxIfSXmtU49xfXyijtU7S8gaGk2Lt5XthdVMz0igrNZF9vAYLk+NZ19JjW6M/buJALrX1BU1y65+xv2dLtCvU/tSynQAIcT/AW+rwyqEEAuAr/T0oCb9z7nWq/HPxK1ubGZGZqJPcp+WvGjsab+7uIaE6HC9v1jeqQZ+u/Eoa3aVMml0HDdcPpL38pQhU3R4KI3N3nbH7q4hAnA0tyKAnJP5PL/uV6TUK/Mjb2VfzYov3I3TGkmUNQSHu5XE6DCqGlv0GrdsVWLkspR47l97kLJaF2t2HQeUhMZLR8XqsZ4p6XaWzc1kYc5IPbBtj7Lq+VPzspOJt1lxur16HRyILn1+3f2M++o7EczzOleys1OllP+r/SOl3CCEMGevBjH9FaTUqutdbq/PkMLI2n1lrNqmFIOGhQq975g2ff/0DTl856/72F1cy5T0eBbnplDrdPPOwXK2F1ZRWq0Eeg8cr+PwybM0q9bGaIh6nTAmJd/a+w8e2vpnwlq9uCxWfjr/O6y9ZJ4yWzYsmvL6JqCVphbl+KGhQIsyvIoJt7CvpJYaRwsRlhDGJkeRM9pOvM3KwpwRakFsFbuLa5gzfqhS3Z8N33v1ANnDY4m0huie0Z2zMhRlSGDqGLv+N3T8+XX3Mx7o+rfO6KoxOimEWAH8Vf3/G8DJ/jklk74g2NOrt666sboeAs/yGMs6Zo1NApThl6ak+PQNOUwdk6jGWwSrdxbjcrdSUq2UacREtH0tm3vi9nRCrKuB37z7LPML9wBwNCGFuxc9REFSqr7OkYpGPVitGcG544bxYUEltc4WdhRVc+uVqXx2+iw1jhYOlTeQEB3Bmo9KOXSijkcXTeD1vWV8XFZL3sl6Zv16CwnRSkLm9sJqZmQmsGxuVofD2r6u3u/K+gMpT9JVY3Qz8AjwNspD6UN1mckgprMZro6+mB1V1zvdXt0zCvSUVQKvilD+sxvz2ZJfSdbQGF11cfXOYhbmjOSdg+XsLq5hd3ENMzITACWJMVD+T18x6cRn/G7drxjRoASR37hkHo9f8x1aIsKVQJBKq+p6ScAaApnJMewtqaHW2aIX0AKsvWsaj7zzKdnDY7n24mEcr3GqapEnKaho0APcyj4lMzIT9DjSzKwk/b3trtfS10ZD258mvwvnXo62S8ZInTVbJoSIklI6Ot1gkFLZ4Nv25fNEVw1PsC99sO4axm2BdjM8NQ63T0zIf38ut+LZRFpDyU2zs6OoGldLK4+vz9M9oVFxkSREWQm3hOiekJbP01cI2crSPW/xw61rsMhWnJZwfvyFu3n74jnK8fxCUcYAubvVN0FSM0Rbjpzh+/PG8tc7pgLw7MajFFU6mJGZCEi25FcyIzOBEXGR7D5Ww7M35jApNV5/b4ypAN31croT/+mK4WrrphK4FXdXqHG4+7+jrBBiGvAySgLiaCHEpcCdUsrv9vTAA8Hps03tmuLB4FLO6yldNTzBvvQ9lTINdlO8uLWIVR8e49apqXozw9f3ljEl3a43T4yzWRgdb+NQ+VlO1Ll89qsNkfrCHtmd9Tz9r2eYfWw/APmJqXx30UMUJbZdm7/h68pxy2pdPt8nrWFk9vAhLJmWrhf9gvI+pSVGKeejfgbPbjzKys0FVDvcJKjB/a5+//paI9tfMaGnQ/hzUQ7yLPAFYB2AlPJjIcRVPT3oQDFsSETAD28wdkroLt0xPB1trz2t/cW/AqHpTRtjH1pN2fqPlZDiwbJaymqdVDvcrPqwrfg0PFRQ5/QgpTPgvqFvDNEVZZ/y3LqnGN6odPX4+6Vf4NG5S2kOC2+3bqRF0OSR+nGjwkNxBJi9A2WWTNPGBuW6D59U8v0irSE+6wZvV60c6T+HT+teYlc/r0CfbUdDa+PvYPsz1sf15D44Z1X7UsoytSRDI/CnNIhJigkPaPEH+yxDV+htops27W4Ure+salwrdF2+YDwAL20twun2+GhTK8HdsziaPYyMi6BcrSlr9kpCBbrIWX8My7770Vru3/43QmUrjWERPHztPazLvjroNi6P7wk4mr2MS46mocmDq8VLrbOFccnRzBqbRKTVos96ade9o6ia2eOS2mVW+2efa+/nkmnpHDpR71MUG6iGr6P/jQR6qHbH6+/tfXCupvbL1KGaFEKEAcuAz3p60MHG+SCzcC6GklpNmKZOOHVMRdAvpn+GtZZBvfSqMUzPSGBHUTVT0uNJtUfx0bFqPK1SN0QaXsO935eGKNFRyzPrn+Gqkv8CcHhoOncveogS+8gOt7OFheBs8Z29O322idHxkXxyUi3MrXcRabWwcnMB+0uVnKDthVXMyExk2dxMPdXBeGPbo6ysuC4byGvncU4cFcvEUXF6M8mXthb5GDF/KZHOykeAdmUp54u2dleN0V0oWtUjUSrs/wOcV/Gi851zMZT0v4G0LquaEL7REGrGZ9ncLAD1xlSaKD72FaV9j3FmpqzWxci4CFxuD/Uuj48h6kuuLD3Eyn8+xVCHMov1l8u+yONz7qDZ0rkB1wxRTEQoDU1eIiyCepeHT1xtweuGJi8ut6IyqTV0TLXb2jVcNCoQKJ6TV88r0t5X5f0p9JnONxoUzRAZpUQ68l6MDSADtXfyp6cPuP56MHbVGI2TUn7DuEAIMR3Y0WdnYtIhfTWU7OiL5J9F7T9k23WsmhXXZbMpr0Iv3wCpFoVWExkWwo6iaoOERglLZ46hqcXDf/Iq2nlGfUlIq5d7PnqDZTteJVS20mC18eCC7/Hu+Bnd2o9miAAsoSEMs1l86uAmjY4l71QDRZUO0hJslFQ7+cKEYSREW9t9Nsb30DhL1dHMldGgaLNxE0fF6fvrihHwf6j0VQa3/3bGRNa+MEpdNUbPA5O6sMykn+hOwLIjuvoF1IZsMzIT1Ror6dMOaEZmot4qaF52Mq/uOU5JtZN4W5jef37l5gJS7TaiwkO7XdjaHZIaa/nt+qeYXnoIgEPJmdyz6EGOxw/v9r6MsrSNzV4am72MiovkRJ2LGZkJZI+IZdWHx0i123jmhhz2ltTonqNGW86OR/dstOFbUWUj2wqqWDozvUONIs2gONVkUU10TTECnnbyvEa6Otzq6QPOeG7+xdH9NrUvhLgSmAYkqW2DNIagyMWcV3ze8oz6q61xjcNNtcPN9IwEsofH6AJhM7MSmZedTIv3U73yXPs9NCackmontc4WvbfZC1sKfcTv+4PpJQdZ+c+nSHQqM1mvXP5lnrj6W7gtYT3epyVE4DEEseaMH8qxKgdjEm18XFYHKKL+W4+e4b7543yGRca4zrK5WT6ez0tbi9hWUMX2wirCQkXARpXQJs6v3eDGFAFQtJT6s8asq9v5n1t/T+1bUXKLLECMYflZ4PqeHnSgCJZndL7SmWEJ5DkZO20Ee7Ku3VemT8NPGNFWFLr6oxLmZSdzeWo82wur1Qr0OPaX1rCnpJYZmYlkD4+hutHNw299wtkmT7t99xWhrV6+v/3v3P3RG4QgqQ+P4kdfXMZ7Y6f1et+eVmWmzyvRO4tsL6xiuzpJqM0K1qoSJIHiOUYdImNgeunMdMJChRrQVvBvhGg0NP4Go80IhPZ6yN5b/M+tv6v2twJbhRB/1ponns8EyzMaCPoiCNjZky2Y59Q25leS3PxlTY03k6ullS35lRRXOdRcmDyeviFHfyJq8aI4m4UxiVHUOd28sb+dlHmfktxQxXP//A1Tyj4F4ODwsdyz6EFOxPZ4hOCDoG2m72R9E/kVSgB70uhYZmYNZdexasrrmiiqbATafw6dycr6e0TaDJvxu9lZTtBgfKCeq6n9l4UQi6WUdaBrUL8mpfxCTw88EATLMxoIzvXsWKDlxtku/5bSWrcOl1tRRxwSYSEtwcaSK9P0jh7avrQOr2t2lTIkosupaz1i1rH9PLP+aRJciurjqiv+h6dm3UpLaM+HZf4kRVs50+gmJiKU/8kZRX6Fciyb1cLCnBHUOtxUnG3igWuU+rtADxYto9np9lJU2agH9YFOp90781y7y7mqMDgn5SBAomaIAKSUtUKIoT09qEYX2luHA2uAy4Fq4EYpZYn62nKUXmpe4HtSyvc6O95gihkNZKKl9mQtqmxk17EqtCA0tEmE7DpWxe7iWpbOTPfp1vrzf+XpWs77S2u4PNXOU9dfys/WfUppjRO7zdovwzOL18MD2/7Kd3a/CUBtRAw/+NL32ZzZUau9bh4jBBKjw/nxFy/it5sLKKp0sKOoiqJKhz6V/+0/79WzpfeW1DApNZ7VO4tZubkQp9ujFwgbM5oPnajz6Xbb2bR7Xz+ozlWFwbkqB2kVQoyWUh4HEEKk0sts/S62t/42UCulzBRC3AT8CrhRCJGN0k1kAjAC2CSEGCul7DArfDDFjPrC1e5qF4j2ZQgKm/Iq9Kryx9fn6bKwRomQvFMN3D9/LE63h5N1TRRVOrCGCiRKq+jthdUcOlHHmYZm6l0eGvvBEA0/W8lz657iinLlq7F/xHjuXfQjTg7p9fMQAJsVnG5FpO302WZe31fG9MxEahxu3RD95EvZ/Oyfh3VDNCU9nupGN89uPKoXA2veooYxZ2jiqHKcbi8Lc0b4vBaIvn5QnasH37nqDvJjYLsQYivKOz4TtUtrL+i0vbX6/8/Uv98EfieUmpRFKMPEZqBYCFGo7u+jjg7YnzGjgSi27UoXiEBlCNr5Vjc2MyXdjlZhrgzLFGOSHBOO1RKiz/xoRitUtFWtx0SEEhUe5vPU7+tkxjmFe3j6X88S36TEbf4w5XqennkLntC+GQ5GhoVw3cQRvLHvBEOjrYSHhTIiLpI1HykhUntUGEWVDlZ/VKIboukZCeSmxetlL5o2kVEUTdm27YETqO5LC2r7Pyz8872CJZ52lXMVYzon3UGklP8WQkwCpqqLvi+lrOrpQVW60t5aX0dtbVQPJKjLd/ltGzDX37+9dX8ZikCuen/T2RMvUBmCMQdGU2NcNjeLOeOTWZybwotbiwCoaFDygtISbCRFh+sNFL0SQkME3lbJkIiwfktkDPO28MOta1i6920AqiOH8MCX7ueDjNw+PY6rpRWkIhc7PTORNR+VklrX1qHWmEuUNfQ4eacaeHTRBL0h4/7S2nbaRIEwflZGAxPsYaFh9G77osOsP335EO3X2TQhxHgp5RHVEEGbuuNoddh2oKcHPlecu/bWwuf3ufCUOnriGcWyjF04tC+3VkM2YWSsXhcFiqcAith8UoyVA8frdY9g2JBwpV9Yk4chEZZ+M0Sj6it4/p1fc9mpfAB2j5rA9xb+kIqYxF7t1xICsrV9hffGzyqodbYwPDaC5QvGMy45hlP1TTx1/aXE2sL0lkoJ0eFsLyxWu8EqPLroYp/gdLDP3fhZGfOStB5ywR4oxqFeR7WCPWUwKVZ05hk9APwv8HSA1yQwpxfH7kp7a22dE0IICxCLEsjuUmvsc8mSaWk+uR/n6kMO9uU3lhwsm5uFU+26Ycye3VFUzVVjk3ymmkEZdmwvrGa4mmOj4WpRDFGooN9yiK45+hFPvftbYpsdtCJ44cob+O2Mr+MN6XmObQhKc0ajgq0msh8THkqts4V4Wxj3zx/HpNR4bn9lD0WVDp7ZeJRT9S41YK/E1AAfZYL9pXVcnhqn77crn7uxZ1xnQyjj6xmzonv6FgSlL+NJ/RrA1kT4pZSze3qADui0vTWKftISlFjQ9cD7UkophFgH/F0I8QxKADsL2NMP59hlAiWAGX/3F/5Bam2ZMXdFW0ebvtcS5wDKa13c8vJuHl00gU15FazcXMiMzERunZrKps+UlJERsRGk2G1q54q+jwsBWD0tPPTBK3xr/zoAKm1x3HfdA2xPv6zX+7apXUVs1hDGJcdwycg4mjxedh+rYcoYO2/sO0Gts0WfHbt3ThbHa5yMSbTpjRhXXJftk3kMgn0lNWoyZJVPPpHT7dWNfyD1S61MRPNW/V8/l3HHvown9fcw7asdvS6lfKunB+5ie+s/An9RA9Q1KAYLdb03UILdHuDuzmbSzjXnKmi4ODeFD49W6trSWqAUOld8VPp1KU94bTZNi02UVjs4Wa/JZjRx3cThHD5ZH7BVUG9JqTvNC+88ycTTyrnsHD2RZV/+AZXRHfYQDYpRIXJEbATeVkljs5eEqHD+W1aPzWphR5FScf+Vy0awbG4mmsIhKFP2RZUOhsdG+ASmjRKx980fq6dBGDu+Bkp41AhWJuL/OvQs12igFUv7O+nxy+rvoSg1au+r/88GdgI9NkbQpfbWTcDiINv+AvhFd443mPKM+gp7lFXXlq51tLC/tI6lM9PbGR5NkmLFddlkJEXrKo23Tk3lWJVDL0+YOCqWrKExrD+kxEWGRFg42+Th4xP1tPal6JDKgiPb+fWG54hxO2lF8Nz0m3hu2k209nBY5q/OOCo+kj0ltXoweuvRM+w6pnh4U9LjAeETM9PelynpSsmLlOgJoP4zX/564BqdJZsGysJenJviM3zzH+51R8da26a7DLQx62yYdjuAEOI/QLaU8pT6/3Dgz/1+dn3MYMozgt59+MZtlSe35J2DJympdrYrwly9s5i1+05wsr4JR/Mh3rhrmo9K42NfuRhQnvwrNxeSardxsr6JuMgwfr5oAr9+L18fovnTU4XGcI+bH7//R279778AOBMVz7Iv/4CPUi/t/s4MOJq9ejvsuMgwxg8bwp6SWkbF20hLjGLrUaVxpDI9b9cr4jVPRNMYUkT1YUdRtf4+d5QmYfwcg3nFgZb716Vpwzd/g9ZVHWvj7+4y0MHsriZrpGiGSKUCpd31ecVgqk2DnsuEGnVytG1tVgsl1U7sUWHcOyfL5xhGGVitGn1xbgrVjc1sK6hiXnYyGUnRPjccQJ2rhb/uPk5Zra9YvpGeGKK0mnJ+t+7XXFyhpBFsS83hvi8/QFVUfPd35keEJYQXb7mcR9YdprTGSURYiBqQr+LFrUXknVRKO3LT7Pqkg1HITNMYmpedrM6atRW7KkmhxTjdXj3m1tv2PoEMSCAdImN5STDvvrehgd4as3NVDrJZCPEe8Kr6/43App4edKDo79q07no6gT78rjydjPKwxqlfTVNo69EzTEqN15d/eLSShiZFizo3te2G/09eBSXVTh5+6xPmjB/K4twU/YbbVlDFgeN1FJ1RikEtqgfU25aKX87byhP/fp7olia8IoRnZnyD31+5GClCOt+4CzR5Wnn301NMGWOntMZJnatFVxnQhO9nj0tiYc4I/bMyvp/GgmH/IZi/aD3Q6/Y+garyg63XW8H87p5Ldzkn5SBSynuEEP8DaB1BVkkp3+7pQT+vdNfNDfThd+XpFCj2sEk1LKAk8mnB1k15FewoqmbZ3Ey+NHGEj9uvrd/gcvPEhiO8d/g0YaGCVHsUlWrSY5XqAXh6GS4Kb2nmkc3/x9c//jcAp6PtLPvyD9k9+pLe7TgA7xwsJ1zNl9peUEV6YhRT0u3sLq5h9rgkPbcnUI1YT0Trz1WMZSDrGbtCv86m+XEAaJBSbhJC2IQQMVLK/mv9eR7Smy+L0asKpOioVcobSw5qnW3bGGU/IHAxpjGOVN3YTGyEhfomD4VVbb3tAb30I85mYWp6AtsKK7GGhNLs8dDskd2e2h9TfYIX3nmSiypLAPgg/XLuv+5+amw9rhwISoiAZo+k2aNoWMdFKjNnKfGRLJ05Rm8j5P++9LRFUE89iZ7ECwerdIjGOZEQEUL8L0pJhR3IQCm9eBGY29MDfx7pyZelK22FfeM+Um9v418iYJxu1rp2+J9TUWUjt/1pjx4H0oK9/oQKqHN62F1cg6O5FUcPB2hfObyFX7z3AlEtTXhECE9f9U1enPK1Xg3LwkIFLV5JRFgITS2t2MJCiYmwEB0eSlGVk8QoK1UON00eSUykcqOX1booONPAlvxKn3yrQJyrTiyDJfO5rzhXMaO7UQpRdwNIKQv6QkLkXDMYp/b9xdn9Wx6Db7dPwEebeuKouHYxp5WbC3w6Thh5fH2ebohiIy1EWEJpamjTp9ZUDL1qR9daZ0uPriuipYnHNr7IDZ8oocWTMYncu/BH7B+V3cmWnaMF4ZvUbh7XXz6SkfE2XtiiGOyGZiU7fHpGAo995WLWHSwHBAtzRgQtqTAaoIHUmjqfOVcSIs1SSrfWxFEtzejHOq/+4fTZJlbvLAmYGzJQ+A8Xnt2Y71Nwq90kWmBVkxzVShKMDRT9c1UCNQDMGhpNxVlFpbDe5aEeD+EWQbMaFMpNtXPWVUFDs7fHH3BWZSm/W/crxlUdB2BzxhU88KX7qIsc0uv3C0BKiFC7vwIcq3KyZtdxkmPCOdvk4doJyaQlRgOSeJvVp3A5WElFoBhSoAdDXzHYh1w94VzFjLYKIR4GIoUQ81F6pv2zpwcdWLp2i52rBLD2X0rfglv/p3QgMfRguSrgq6e8emcJq7YVk5Zgo9kjCQ8VNHslqQk2jlYocaO9JTU09DTLWkoWf7KJxzb+gUiPm5aQUH41awkvX/E/4NuNuFeEWwQLc0ZSUNGA1RLKHTPS9RqyGZmJJA+JUKvplTKNednJPL4+T0/4DESgGJJ//7GBTAi8EOiqMXoQuAP4BLgTJWv65f46qf4iJtzCwpyOu4pqDNSY3r/gNpg7bzRiwWZ4/P/WtIqGRFgYERuhl3sYM5ZbZc/8IZvbxc//83u+dngLACeGDOXehT/ivyPH92h//hhLPJo9kjf2tT2AqxqbKap0MD0jAZC6NEpGUpRuiLQ2S6/cPjng/jub2fw8xnj6mt4O04Ts5MunKjIellL2zbdqAAkfniWfe+3fXfoyDXRqfH/wy3c/07t+GPvej4iNIC7SQt5pJacoWi0s7Wp29fgzxbzwzpNk1CjCCe9lTeWHX/w+ZyN6VmUeF2mhxduKwx08aD5pdJzeUujA8TqmpNsJCw1RW00noLWd1lQaV39U0qFn1Bmfx+9DX1PjcDN02PATnobqHgXCOp3SUAtQ84UQ513GtT8x4ZZ2vc6DoT0pz4cvntZCWcsKDrbO4fI2RdDkIeHMyEwkJT6Sk/VNFKq61oBeDKsZovDQtiFWbKTBmZaSmw7+m3/85QEyaspxh1h4dO7/cuf//LjHhgigzuXRDdHQmHAAhqlyJpNGx+mlHHtKaokMU5IPw0IV4zN7XBLP3TyJ526+jIykKF2l8ZXbJ/fYEMG5+z505bMcrJyr7iDxwGEhxB5A/9ZKKRf29MADQUOzh015Ff2iCzOQBKv21l7Tlu0oqlY9CMGjiy4m3mbltxvzeefjk9S72vSJkmPCsdssnG32kpsaz/v5Z2j2KgZKWy+62ckv3nuBRZ9tBeB43DDuWfggh4Zn0ROMwzAj4RbleZlqj2ThxOHknWpge2EVE0YMYXpGAhlJ0eSmxbMwZ2Q7WdZVt+bqsaLzhQt5ONhVY/STfj2Lc0Rf16b1p+venX0Him3sOlZNVnIMqz48RrXDDVIRTXt00cW6h/DsxnzW7Drebn8VDc0kD4ngS2OH8s7Bkz4tnwEmVBTxu388SXqdUq74r3HTeWjB92gIj+rx9UqUWNbscUm8f+QM1tAQQkNDKKt1ERtpYXdxLVWNikD+7HFJRKoyIDuKqlm+YDwZSdFkzIrWPYvFuSlkJEUHjRH5M1iGYZ/HKf+u0pmeUQRwF5CJErz+o5Sy/9qE9jN9XZvWn0+xrmjbGPV0tKl/Y7GrW01mPFxer+v3aDk3WoNGUCRm/YthD5XXc8gwrANASm45uIGfbP4/wr0tNIeG8fM5d/DXy77Y7dmyQJ7QqLhwDhyvo6HZS3hoK81qqne9y0NspIWiSgcp8ZGsuC5b1aCWGHWIAhUQd5XB4pF8Hqf8u0pnntFqoAXYBiwAsoFl/X1S/UVfJz3251OsKzM5WhMAwGea/945Wbg9rT5DGK0C3dXSqgexNUlal9vDuo9PcvpsM8GIaXbwxIbnuS5/OwDH4kdwz6KHyEse06PrMxoii1Bq3wrPONBi1pohGjYknDDVQwIlk3pTXoWace7b+CBQAXFXuZA9ksFCZ8YoW0p5CYAQ4o8MsLRrb+lrPaNAT7GuuvuBEhKDaeIEv1EUb2RGZoKPDMbscUn6EGbZ3Ew25VWwMGcEr+85zoZPTwNKdvLCnJE8/NYhdhfXYg0N7tlccqqA3637Fal1yrbrLrqKh79wD43htm69X8HQinCNk2c2q8DpljjcHhqavAwbEsHps01MGh0XVEbDP1eoO0OvC9kjGSx0Zoz0WgBVJrafT6d/ORd6Rl119/3X62g7Y6KjMSO4rWhWsu7gSd0Qrbgum6yhx/n4RD27jlWzu7hWlxcBZVj2wDXj+ObLu/VcI7dXtp/Kl5Lb9v+Th7f8CWurhyaLlZ/NXcprl36hT5IY/Y8XKiDWFkaNo4UhEeEMjQnRz9kSIlg2NwuQuiCaUQExUF+xngy9Bkvs6EKkM2N0qRDirPq3QMnAPqv+LaWUPcrvF0LYgdeBNKAEuEFKWeu3Tg7wB2AISneZX0gpX1df+zMwC9CCGrdJKQ92dtz+1jOCrrv7/iUHRgH9YGg3l9Pt0YdlACs3F7J05hiWLxjPFWl2Hl+fR9bQGF2dMS3Bpt/UGs9szNcNUahQRPaNhmFIUyO/3rCSa48qfTGL7CO5e9FDHBma3tW3olPSE5Xz8ra2nUOEJRRo4fTZJpZeNYaPy+o4WeeirNbFoRN1rLgu2+faA/UVW5ybwuqdJbjcHpbNzerWA2iwxI4uRDqTne15f5iOeQjYLKV8UgjxkPr/g37rOIFb1aLcEcB+IcR7Uso69fUfSinf7M5BuxIz6u2TsavufqCSg862024qp9urGiUv+0sVgxNpDWFxbgpf/f0OSqqd1LvczMhMZERsuB68BuUpUlbr4sqMBIZGW6lztZBit6nteBRyTubzu3d+xaizZwB4e8JsfnzNd3FaI7v1XnRGUaViII3KAVekxXPgeB1JMeFcO2EYCap+t5ZFPXVMRcAuLMa+YlqxMBC0YDgYZuxo4OibHsHdZxFwtfr3auAD/IyRlPKo4e+TQogzQBJQ19ODdqVQ9lw/GTv78vsbR2OboX0lNewoqtYVCo2CaWGhoWwvrCLeFuZTea85P6XVTs40KvvRDZGU3LH3Hzy49c+EtXpxWaz8dP532JD7BZwdZEN3RDCJEiPG16sdbspqFU/omY1H2V6oNC4O1OzQ/73R8seM2k7dNSpm7GjgGChjlGzQ1D4NdJgWLYSYDFiBIsPiXwghfgpsBh6SUgacCjK2tw4dkkRnhbLn6snYmZia9trqnSWs3FyA0+3VjajypJfsKKpmekaC3q1iXnYy2woqyR4ey42TU/jpPz7VvaIoawgOdyvWUIHbK2nxtuqFsiHAENdZfvOvZ5lXtBeAgoQUvrvoIQqSUn0jy93E3xDNzEzg05NnA0qTzMhM4P754yirOUhpjZPs4THMzErUu2X4B6Y15QLjsLWjrh0mg5t+M0ZCiE3AsAAv/dj4j9qUMaiFUDuR/AVYIqXUvtnLUYyYFaV19YPAY4G2N7a3Th13iVwyreOYx7l6MnbkgflW4Stvjcvt4dmNR3G5PURaLXqOUG6a3Ud6Vuv7rkzrKy2MjN5RYrQyVa6pOsZGWsg5nscTa3/JiAbFC3njknk8Mu8uXFbfjrJdwRICQyIthBKC0+P1KcIFRRWgySMZEmEhOtxCYrSVQ+VniY20MCYxin8fPk1pjZMZmYncdXWmKqtylJWbC6h2uEmIslLd6GbVtmMsnTmGZXOz2F9aw/bCap82QibnH/1mjKSU84K9JoSoEEIMl1KeUo3NmSDrDQH+BfxYSrnLsG/Nq2oWQrwC/KAr59STAHZ/za5oQ4lAnUcDeWf7S+v0IQu01WjNGpvEsxvz0cTDoC0ovjBnBIdO1LElv5KJI2MpONOgB63TEmxMGR3L8Jdf4J7Nf8YiW3FawvnpF77Lmxf3XMDT0wo1Dt+8WE2ZMVwdskWGhXC2ycPZJg/XXToCh9tLUaWDNbuOk2pX0gWyh8fos2T7SpS4mCaor/Q7g49P1DJ1TCLbC6vJSIoK2EbI5PxhoIZpWtvqJ9Xf7/ivIISwAm8Da/wD1QZDJoCvAJ/214n2VwwpWOdRo/EDJbFRM0RpCTbibWH8t6xe92ys7xfos0iuFi95J8/y/pEKXcdai7V8eLQSV0srI+MiONvUQn3ZKa5b9SNmFu4D4EhSKncveoiihL4fnraoCYzNnla9eFWb4cs7Wc9T11/K4//Ko6iykdIap17uoc2S7Siq1rebPS5JnSmsZXdxLVPHJOgKmZvyKvpVEM2kfxkoY/Qk8IYQ4ttAKXADgBAiF7hLSnmHuuwqIEEIcZu6nTaF/zchRBLK5NBBlJKVfqGnMaSueFSB9u0vlKZlWGs346KcLGqdLZRUO4mzWbh3ThYTR8VS62zh9b3H9UJWTcsHwOn2EBNhITIshNiIMEZ+so/n1j3FsEYlnvTmpAX8+Oo7aA4L73FTRiO2sBBcLa3tonOpdhtPXX8pW4+ewdXSSt7JenVYWUNsZBj1Lg8ZSVE8fUOOsh+1p9nUMRU+eUS1Tjd5p+rJHh7r01ooY1Z0t2YnTQYXneoZfZ7Izc2V+/btOyfH0m6K5QvGd+umMBqxWqebR975lOzhsVx78TCe2Ziv//3DNz+mqNKh9olH7yYLbTk7U9LjafG2cuC4ko4lZCsPHXybOzb+mVApcYRFsPzae1mXPavdeUSFheBo6XrgOkTAtDF2Smtc1LtaONvkO1TTxNxGxUUydIhSg7Z05hgSoq3trvWuqzuW6ujovTWTFgcWIcR+KWVuT7YdKM/oc49RizoQwW4ardhV6xiiBaT3lihB2u2F1YBkeGwkc8cPBYSeUxMaAt5W9FZC2lANINFRy7Prn2ZmyUEADg9N53uLHqLI3qZ8GRYCLa1t4mpGbewQoch5uAIYKJs1hOhwC9uL2lpgR4WHEBNu5fTZJmZkJpI9fAirth3jRJ2LE3VKnVmkNUQ3JvYoKzOzknhiwxHdQAUzKh15q+bU/PlL37TxPE8oqXJQVNnY5/sNJIi1Ka+CLfmVbMoLrDWlDcfW7isL+prL7WVGZgLVjW6uSLMzIzORpTPTdU2fgjONLJmWpsqtKobI+HSJjVD+u7L0EO++cq9uiNZc9iW++s2nKU5oM0ThoYIvXjKMSaPjdHG1ZkPnxlZJQEMUFR6C093KmQbl2rUikYtHxPK3/53C7HFJPLpoAnddncGtV6YyIjaCiaNiWTpzDMaZzRqHG6fbq7dY6uj9CSR0dj6LkpkoXFCeUUOzh8fXB9dB7imBgtwdPb2VGy94qUJbprVH94YKzigGaGZWIvfPH86pehdLrkxj7b4yHvvKxdz32kEOldejDY5GxkVw71XpVC7/Kd/d9ndCpaTBauNHC77HhvEzCA+FVsOse7NX8s7Hp7GEtK85iwgFTdLIGiqYkZlIwZlGYsJDyDvt8Fm3zXwJXt+rVNE73Z8wdYydeJuVk/VNnKxv4kuXDPcxJv4tlrobqzPLOM5/LqiYUWLaRXL33r29kh8NREfFmoHoajypqLJRj6PcODlF37d242lB7RmZCZRWOymrdemJjEmNNTy//jdMLT0EwCfJGdy96CGOxw/HFhaC08/LCQsRINpmvgCiw0PweKXeEkhD0yIKt4TQbEhqDAuB+KhwLCGCk/VNxEZafBQktfiWsTNuIFVKY+fbrsZ/zFjR4MCMGXWRtMSoPjdE0L7OzD8jWMNotKDzp75/EqOx3EErDLVHhalxJGUGLWtoNI3r/83K9b8hwakErtfN+ho/yL0FtyUMoJ0hAmgJMIXW2Bw4gN3WpaPVJ6GypRXOqA0hLSHCxxCl2m0szBnp8/77z3x1lPzZmbdjxorOfy4oY9TfHWX9C1mh7SYqqmxk6Zp9eh1YZzdOZ0O5rKHRFJ5ppKzWRUp8JAsuHs5dM1L54Kbv8pV/ryEESX14FE9c/0OOTpuL+3i97tFEWUOwR4W3U3fsCuGhEBWhyHxMGh3HU4sv1TWRNGLCLXpXV1Dq00prnDy+Ps8nQ/qKNDsZSVFckWYPeCyzaPXC4oIKYGuFsv2F9nReMi2N5QvG+9xEj6/Po6jSQUZSVLubyxh81f5WatIKsVlD2xlPrRmjUf3w+CcFxHzxC3z136sJQXJwWBZfvv05XhuVy4Hj9USGhSBRPJb75o1lRFwEY4dGESBE1CHNXhgSoXhYkWGhxNusTB2T6LNOVnI0KfFtFf5NnlbsUWF6hrTG8+8XUFTp4Pn3Czp8P81h14XBBeUZKfR/jCzQkEHpUKF0qvC/ufwTHZ/YcISlM9OZPS7JJzVAG+a53Eo0WdOunnVsP79c/xvCXA0AvD37Rpbn3kRTSJi+raulFYHSp/659wvb5QEZGREbQWK0lTMNzTS1eKkzDLfCQ+GZG3J4Xs38Vlpvp1HraOa9wxUIIbh4xBAirBZd3jYuUvGkjHKwNQ43WckxuD2tQbt3mHGg8wftsyIktMc25YLyjJQeXKJX0789nULWOlX4x6z8h2OLc1NYvmA8CMGW/EpVu1ph9c5inthwhI9P1LJsbiYrv3Yxv9n/d1avfQS7q4G6iGi+/bWfcN/kb/oYIg3NDGu9xgJhC1NcpfTEKEbEReLxiyXNGZ/M3pIa7p2TxYzMRKobm6l1uhkZb+OmySmcPtvEml3HiQwLYdncTGZkJlDnaiEjKYp752Sxdl+Z/sVd9eExrhqbFDSO19H0vsngQvusQm2xCT3dxwXlGYUI4SNZ2hO6GlRVOncUo80c+T/Z/WUwjCJgd87KUItfQTMhNQ43+0vrACWZcWG8l2HLbmLSZwcB+O+Icdy96EFODhlKTISFhiaPnont8x4ACVEWGppa9EB2lDWEECFoaPbi8kic9U288/Epn+00TepthVVsOFyh15ZtL6zS856mpNuZkm7n0lFtZRrGjh3PG+roOksKBTNmdD6hfUZ3PVVf3cmqQbmgjFGrlNyvJtX1lEA3SCBxfWPLnEMn6tpJW2hGbdncLJbNzWpXvd+WEKh4ci9+UMj2wiomjY7lptOHWPjth4loVGbLXpz8Nf5y3R2cdHiJsITQoA7BNEMUaRG41On5VmiXG6R1bw3Bty7N2E5oSEQ4TneTnhBZUu3Uh4kjYiPISIrSZW7njB+qX4c9yqoX6/qrMWrKjcGaapozZOcP2md1V6u3x63MLihjdKahGZvV0q34Q0ddOzQCietvya9kekYCntZWtuRXsnpnsU9rnUCtiLR0AK0XmlbqYbOGkneqgTBvC3e8/QJf3PQaAA1RQ7h3wX2cnT2foVISYlVUEkfGReBtldQ0NuNuRTdEndEKev961DPQCme1so7SagdltS4iw0K4coydsv3lnKx3UVTpINVuY0q6nQ+PVjIvO1kffhnfM2N6gvG3ickFZYx60h2kK8My/xvL+Hv1zhJ12tt32ipYKyKjfvOtV6aSkRTFuOQYPEXFPPrmw2SUfAZAfuZE3H/9O1c2RfDh0Up2FFUzaXQsjc0eyuuaOr2ucEsIUdZQagyKi8kx4VQ0+ApmtkqIt4Vx65VpSqDa6WbxizupcbSwp0SJXc0aO1RXZ6xvclPnDJzpHkhC18RE44IyRj0RV+vKE9z/xjL+v2RaGjZraJeNoCa65nJ72fDpKcpqXWx84iUefP1XDGl20IrghSsX89sZ3+CesxZsVvjfmWM4XuOk4Eyj3opak5c1YvR6clLiSLVH8l5eBfUujx7r+fhEHbuLa/Ui2QhLCI8tnEBhZSOrd5awZFoaa++apudM2awW9pbUUFqjKAbUORUZkEAzZOe6ZMPM4D6/uKCMUU8I9gTv6pe3Mw/AGF9yuj24Wlo5XF7PhBFDqKg8yyNb/sjtB9YDUB8dx91ffIDt6ZcRG2lhW0EVB47XMSMzUc850ko0/A0R4DMztru4ht3Fyt9pCTbGJUezalsxE0cO8Wl33eRp5bebC/RkTS3+tfauaazeWUJ1oxuQLJ05BgREhoWwMGckm/IqiM9t61+mzRTCuRuadcf4mbVtA49pjHpIX315tfhSRlKUT+vp5Mpy3nvjYdLLlCYpu1IuZvcvfgfNEYyqcnCizqUaogTOupSh1YjYCOZdlMyaXaXtjhNoZk3D5fZy8IQSDD9UftbnNa3H/aTRcdQ43D7SrjZrqE9LIO19eHZjvo9QfkclH/1Jd4yfGcMaeExj1EO68+Utqmzk8fVKwqN/Ts3i3BQ95jN3vGTpVWOIeuct7n3hV4Q0NtAqBM9feSMf3fJdfnHtZUTkVXDHjHR+9s/DXJWVCEKw5iPF+FgtISyZnsauY1UcPeM7YxYSAl5fbXxdv6iioZnGZiV2NHHkECKtFnYX1xBvC2P+RUN5Y385NmsoB447SUuwUd2olNUEbwkk9N8DeZN3Jy5lxrAGHtMY9ZDufHm1BoQt3sPMzEr0GdrZo6x6F4/QFjfXvfJrJqx7FQBHXAJv3PcrnnUO49YR8fxw7cccOF7HsCHhnD7bjD3qLIVnFH0mS4igpNrJ6p0levwGlByippZWWrztz8tYL6tN70daQ/nlVy/hkXcOs72wiriocF1jWlu2alsxCdHh3DkrI2BLIGOcrCvvkxmvMYEBysAWQtiFEBuFEAXq7/gg63mFEAfVn3WG5elCiN1CiEIhxOuqeP+gIFCG9r1zskhLsFHT6OKJDUd48YNCn22WTEvjiUsi+Nb9N+qGaMfoicy65bf8O/kiAD4tbxPhP31WGZYdOF6nl3V4WiVpCTbe+/S0LooWHR6Kw90adHgGEBUWSnJMOBNHxgJKQuXre8o4UasYtMPl9SzOTSHeZqVFda0mp8V3KaDfVcNiZlqbwMCVg2jtrbNQmzAGWc8lpcxRfxYalv8KeFZKmQnUAt/u39PtOoFurL0lNUonDDXZMO9Ug8829nX/j5vvXERS8VFaRQi/mfENbrnpcTIuzkAb8pyu952uj45QProIi2DsUKW9T0m106fyLjayfUmIRkyEUhLiaPFS0dDM1DF2pmcksPSqMeSdqqek2ok9KowdRdWs3VfGbzfm65X5V2Yk9pkH46/waHLhMlDGaBFKW2vU31/p6oZqe6I5gNa+qFvb9zeLc1P0jOqiykZe2lrEvOxkZmQqJTtpCTYeXTRBWdnlgjvugK9/HRwOGDaMj1e/xd/m38ri3NFMHWNnd3ENaQk2vd+ZRmNTK5YQaPJIXC2KCUqJj9SjNSECyuuaCBWBy/IbmryEqi9FhIUAgh1F1SREWXl00cXMHpfEM4tz9GLdDwuUnm3xtjBdGK0v0PKqupuMavL5Y7C3t44QQuwDPMCTUsp/AAlAnZRSSzs/AYwMsr1Pe+vRo0f3wal3jLEf2qET9XpJyKOLLtaD2PE2K6+v+Q//88tlWPPVav358+Fvf+MHaw5T63Sw/3gta784DZvVQnmti5LqUiaNjiM3NZ6Ks02s/+QUmsjipNFxONwefTreOHNmtUhc7TtJA8o6kWpbobxT9Sybm6WrVWolHFrJxjM35PDDNz/mqesvDWo0ehL7MWexTDQGe3vrVClluRBiDPC+EOIToL4752Fsb52bm9st/ZCeBla1G2tedjJZQ8vYVlBJdaNbv7Gz/v0WX/7NT7B6mvGIEPZ/+z6ynnmc1btKuTw1HrenlekZikaQf9Fs3qmzlFQ58aqGKDo8lL0ltdQ4WogMC+Gi4UP02BKAq6Vt1sxITEQoN18xmmsvHs6y1/7L9sJqsocPYVNehT4VbzQU9igrmx+4usPr7km6gzmLZaIxqNtbSynL1d/HhBAfAJcB/w+IE0JYVO9oFFDe5xdAz3OJtBusxuFm85EKPWHwJ1eP5pZVPyP8738FwJ08jJ/f8lOOZuUwbnMBa3YdBxRDsWZXKRFhoTz8pYtYmDOS9YdO6f3PoqyhesvoxmYvjc1eIiwCV0srJ+ubiIkIpaHJqxS+ohgiY9shUIZpkWr2tOZRfXyinj/ccjlAu5mwQMXA/oba9HJMesNAxYy09tYQvL11vBAiXP07EZgO5Emlg8AW4PqOtu8LNG2hnt5ca/eV6a2cr3Kf4bbvXa8bIq69lr+v+id/sYxmd3GNHpMB9JKOj08oAeN1B8spqnQwNFq56R1ur49wPsDY5BhACXQ3NHkJDxVozpCSld0WV2pDyQ+aNDoOgFR7pF5dr+kOtSlPFvsE5v0D9UWVjTzwxkHmZSebsR+THjGY21tfBLwkhGhFMZpPSinz1O0fBF4TQjwO/Bf4Y3+cZEdDiECegf+yxbkpICXp617nqucfI9TjRlosuB55jL/MWMy8CcNYGmoj71QD988fyzMbj7K9sEpvotjilRworeWtA4rj52hpX3c2JDKUsy4vU8ckcrSikSY1kBQaIkiKDKPe6dY7eExJt/PLr17CuoPl1Dpb2F9ay8KckczMSuLA8TpO1jfzxv5yXexfQ5M6MRpmfz0iLZcK+r4VlMmFwYAYIyllNTA3wPJ9wB3q3zuBS4JsfwwY0G+8/xDOWGO261i1ol8k3dz2+xWEr30dgJMxiex+8g98lprNqn/nU+1wc9fVmazeWcLWo2d4dNEENuVVUN3oZtW2Yxw4Xscda/ZS41Ai0A5VS6hVSoYNCcduCyPvdCMjYiMAybSMBN5XjYizpRVni68a5aWjYslIiua++eO4/ZU9bC+s1kXybdZQrkiz0+Jtpd7Vwq1XpuJ0e1iYo8wN+MfNtCaVmh6RUVbXxKQnmBnYPcQ/PqLNPGnC80/9+nV+9PIK4k8qcaBNGVfw9vd/yc+XXMX/e/W/gJJvZJQMeetAOQsuGc61Fw/j4xN1lFY7OH22mSERFj25UdGxVhIfXaqndLK+iVXbihk2JFw/Py2mBG3xokhr28cdyHj8+9NTukBavatFjXUJbNb2MrX+16/J6pqY9BTTGPUQ/yGc3svsyBnuPbqJe/75e8K9LXhDLfznm/fxq4uu5ZkvX4Y9ysr988dyqt7FHTPS+W9ZLVPSlXyisloXqz48RkFFg24UQMlNqnd5KK3xTWoMCwkhe3gMhWcacHvbepaB0oxxZFwEAsGJOhezxyX55AdpxsPo0c3ITNSP99T1l7L16Bn2l9bofdmCyaSYmPQFpjHqIp1N89ujrDx97RhqVz9CxtZ/A3BiyFD+87Pn+FtrMiWVDp7+Tz5XjU3C6fZSVOngkXWHKa1xMjktnpFxEZTXKV1Y752ThdPt1Q2SJVRQWuNs14+syuGmztWi5xu1SqUWrcUrcXsl5XVNLJubic1q0YPS87KTWXewHE2be/XOEt0QacNE7Rr3liiGyNjVw8SkvzCNURfpdJr/wAHs11+PvVgRCSq8ci7v/ehJ6sOiKNp2jJR4pdOGEgzOZEZmItsLlRm0PSW1LJ2Zzn/yKiipdvLvT0/pPe+nZyQwYUQsB47X64YoyhqKQ21XZNQoiosMY0RchF5ukhIfqWsLrTtYzsrNhWwrqNQ9HWX4pWx/+GQ99c6Wdt6e9tucITPpby6oVkXdwb/gNeg0v5Tw3HNw5ZVQXAxWK/z2t2Tu2MjdX8klUo23jIiL1GU5Zo0dyuWpcfouUuIjQQiuyVZyRP+TV8GOIsUjeewrF4OA7GHRevlGaoKNCIvvRzcjM5H3f3A1MRFtz5cFFw9n3cGTPLHhCLuO1bBsbibZw2PV9RNYnJuidvFQWlT/8M2PffZpNlE0OZeYnlEQ/D2hgDGS+nrc3/gm1n/9E4DKxBE0vfoaKfNm6qtochrVjc3sLq6h1tnCHWv28vKtVwCwv7ROkeX48Bi3XplKqt2md95IiY/k4bc+8YkfAdQ5W/QpfFDyiEbERrB6ZzEPXnsRv/r3Z4Dgxskp6pBMUXY8Wedi9rihLJubqbcSAnj51iv0Ug8Tk4FCKDmEFwa5ubly3759XVrXGCMC2seL9uyBG26AUkXYbOslV/HdufcweWJqwFklrd3Q2v0nqHUq3VWfviGH1TtL2HWsit3FtaTabT5aREaMbYNuvTKVY5UORsSG85+8M9QZis+WzkzXdaynpMfzy69O5OG3DukV98o6SmV+9vBY7rra9HxM+g4hxH4pZW5PtjWHaUEwDlF8so2lhKefRk6fAaWltIaHs23Zz4hZ9zaTJ6ay4rpsahxunt2Yz7Mbj+pZzGv3lXHX1Zk8e0MO9qgwllyZpk/rXzoqjoykKEprFCVFjejwUCaOHAK0GSJLiGDOuKGEhQruvDqTP912Bal2m77evtJa3fDsLq7l8fV5jEtWXhsRG6FLhGwvrGbVtmOmhpDJoMEcpnUBzTu6ISMarrsO3n0XAZTEDWfvUy+x+I4vU+NwM3FUnD5TtXKzIqBms4bidHtZubmAaoebzZ9VUONo4eXtx7g81c6yuZmAoKjSQUZSFD/5UrY+y9bY7GVIpJVJo5UAdqja3eP7b/yXOqeHg2U7+fLEEZTWOFk6cwyzxw/Vs7VjIy2MHxbDlvxKUu029TpGcd/8cRRVNvLIO5+SPTy2R7NkpjKjSX9gGqMgaDecJqlxk+cEsVfeAidOAJB/1bVsfOCXfH2uok1kTF6ckZnA0pnpROpNGZUZtsPl9RRVOrBHhTEmMZqVmwv0oPi2gkoOHK/jufcLKK1RYkYj4iJ5dNEEXvqgiAPH6xmXHE28zcqOImU2rNbZwpZ8pcZ4w6eniLeFUVbrIjwUVt54GRNT4vQcoukZCWjdaTOSovnrHVN7/N6YnTRM+gPTGAVBu+F2FVUxfvXvidnxN0XRPiKCD7/7MLdaLmN57BC9gt3p9uqxmO2F1ZyodXGNWre1ZFo6LncrH59oS3CMj7L6zM4VVymV/SfrXNijFKNitYRQVu3kn4dOAkrG9rjkKGIjLSQPCedohYPZ44ayo6iKokqHXn3f7IXVH5XwdEoOE0fFMnFUHIDenbY79XaBMKvzTfqDCypmVNnQ7KNNrRFIt3pxbgo/u3IoK/+8nAc/XEOI1wtjx8Lu3Vz82IMs/+JFPsHtlZsLSIhWVBLjbWGUVDtZta2YtfvKsEdZKTjTwO7iWirONrH0qjFoFfNaTKrW2UKEJYSG5hZqHC1YQqCo0sF9bxzE1dKqKzjmVziod3lwNHuVrOrpaTx1/aWMiI1gaLSV7OFDmJwWz4rrslm9s1gdLkqWTEvrVIFAq8zXPLlgmFP+Jv3BBWWMTp9tChiwDaRbbd+/i9u++xWGbNsCwGezv8QfV75JTcZ4vSJfk9kw5iBtyqugVm0ZnRIfqVe1r7gum7QEZdr+4PFaVm4uZPXOYooqG3n/SAUj4yJo8rTiaG5VO78q5zH/omRmj0vil/9zsZ4ICRAVHsqW/ErWHSxnb0kNJ+ubONPoJjo8lDfumqa2RGprGRSI9kZYWc/V0trOOJuY9DcX1DBt2JCIgJ6Bz7CjtRUefxweewy8XmRkJB/e/RMOXPM1Vm4uwBNp485ZGe3iJkpsqASX28PSq8Zw8Hgte0qUThsJ0VbmZSczKl4xRkK0GQmt/ZART6tkclo844cNIb/iLJeOiudfn5zC0yr1Kf5GVfPI1dIKePVyEk+r5NmNRwHJrLFDOXSijoU5IwLGefyXaTlRTrfHjAmZnHMuKGPUKiWrdxb7JPyBoejzzBn48k2wRfGGGD8esXYtsy6+mEscbr0XGPhKy760tUifMQNYNjeTKzMS2VNSq+b81PDqnuOUVDuZPS6JFddlsymvgnnZyfzZMCSakh4PCHYX15CTEq+rRO4uruXaCcmqx6RM8s/ITKCy0Q1SiQVp8aoWr9TPY/2hUxRVOpg6pkJtuOhR6+Ia9eMbr8WoUGlTg+8mJueKC2qYdqahmZWbC/XhmM8wZdMmWi+5pM0QffObcOAAXHxxwH1pN26bZrTUq94V4bIals4cQ6pdUVYsqXYSFxlGit1GvE3Z9vU9ZdS7lHqzBROS+cMtufzyq5cwIzORj0/UUlTpIE5tN/RBfiWeVsmQCAuTRsfy0bEatuRXEmkNYfmC8dx1dQYzs5LYXVzDjMxEpmckUFTp0ItclUYBFlZuLuDx9Xk8seEIm/IqAsZ+zJiQyUBwQXlGQ2PCffpzrd1XxpPv5pH7x2ex/+0PhLS24gwLZ/f9jzL7yQd9tg02na3t64o0O7uO1TBxZCxv//eELh3rVAtawy0h1LlaWPNRKfG2MECw4dNT+n4+O61oG5XXufQC2thIC9dMSKa81qVP54+Ki9C1sCPCQqh1tOienub9gGDW2CSs7xew4rrsdhrV87KTdW/JxGSwcEEZo+QhEdw3f5z+/w2jLHz53z9nxKG9AHguuoh1Dz7LNdfPbret1lfe6fbogV1tGvzOWRnc/sqedjVkTreXcnW6fUi4hZQRNsJCQ6h1KkYJIC4ylLNNXsYk2nhiwxE9QRGg3uXhjX0nmJJuJyU+krJaFzGRYSydOYa1+5UZuDW7ShkZH6l7MjarRW2TVMeW/EomjirXh1zG+rqMWdF9+M6amPSeATFGQgg78DqQBpQAN0gpa/3WmQ08a1g0HrhJSvkPIcSfgVm0tS26TUp5sLPjllQ5KKpsJN5m5aMX/sqCpx4ivkrVer79diwvvMBNkZEBtzX2Q7OpiolGT2nFddkUV+2lpFqpLUuJj/QJTFc63IwZGs3u4hq9TTRAU4ukVcLekloykqK4Y0Y6L314jLAQKKhU9rW7WBnyFZxpYMV12WQkRXPj5BR++o9PmTDSN4va3/txur1mMNrkvGBACmWFEL8GaqSUTwohHgLipZQPdrC+HSgERkkpnaoxWi+lfDPYNoEIH54lr7r/RX6x73UuX/syoVJCdDT84Q9wyy0+69Y43KzeWQJIXRPIKEy2MGcE6w6W42pppcnt4ViVk/vnj2Xr0UpqHc0cLKujpNrJ2SYPI2IjOFnfpHbpaNUTHyeNjuN4tYMqR4uuUaQVy2rrgKK8+MfbrlCn69vOz5ghHixR0SzdMDmX9KZQdqCGaYuAq9W/VwMfoHT8CMb1wAYpZeCS9i4SRStP/PZeck9+BoBnwsVY3lwL48e3W9dY3qHJfDjdXn0YBNKnYywoutOv3D6ZW17ezaHyswBEWEJwq0lDzZ5WhkRYaPF6mZJuB6BKE9tXDdGscUms+aiUS0fFcumoWF1wTRPO1zK+7/37AXYUVbP5swr2lNTidHt8hqAapjysyfnCYG9vrXET8Izfsl8IIX4KbAYeklI2t9/MlzGVpeRqQ6Q77sDy/PMQERFwXS1G5HJ7+PhEnbpU6sMgp9vLlvxK4m2KMFlkWAj3zslSjpNoY3uh0sm1ydNKk6ctedAaKvQA9K1TRxMWKnC6vRw4XscXJgxDm5W7cfJoNqmGKCMpii35lTzwxkFWXJfN4+vz9IC2MWfJxOR8ZrC3t0btOHsJ8J5h8XIUI2ZFaV39IPBYkO2XAksBLgdaY4YQ8uIf4Otf7/D87VFW7ps/lpe2FrG7WInnLMwZqXsaRZWNHDpRx5Ir0/j5v/IoqnSw9Wgle0tqiFBjSpFWCy1NHp/9NhtE0SLCLPz1jqn6UKq6sZlV25S8o3UHy1kyLR1Q4j/GvmRa4Wtump2FOSP0YZqJyfnMoG5vrXID8LaUUlcQM3hVzUKIV4AfdHAeq1AMFhPCwuXrv/9/3Pz1eR3GUoyvzctO5g21M+y6g+W6uP0j7xxme2EVE0fFsfauaboxURIQ05k9Lokt+ZXERYZxzYRkSqud7C6uoaHZS2ykhXqXR5ek1QzcL9/9zPgu+Qyxnr4hR48RadPy2nmbM2MmnwcGapimtbd+ks7bU9+M4gnpGAyZAL4CfNqVg54Zkc7kLyjSGR3JYBhfA6VgdUZmgh472nWsWs8FAqkbDaUMQ/GInr4hh++9eoDthdUMj43goQUX6XGeG3NTdENU43DrRiUyTMlBnZ6R4NNWCDCn5U0+9wzm9tYIIdKAFGCr3/Z/E0IkoQRKDgJ3deWgZ91eNuUpHVD92zNrKHIgHpbOHIPT7WVhzggAnG4PKzcX6uUcWcllHC6v1zuuAqoBkbjcXlbvLCF7eKzaiUPxch77ysU8vj5PjwdpBk8rM1mYM5JDJ+p9EhVNTC4UBm17a/X/EmBkgPXm9OS4xkJZ//bMGsosWqE+zNL0f4z1WvYoKwlRisiZZtwAQ8mFYmRmZCawbG4WC3NG6PVr2jHbAuEeHy8s0DmZmFwIXFAZ2EaCCYQZkwYnjjqpZ1wbi0hf2lrUrsjUuL3T7WF/aS3bC6uZmZWke0HL5mbqUiMdFaX679PMFTK5IJBSXjA/1mGZ8sUPCmVXefGDQpn64HqfbQItC0R1Y7N88YNCWd3Y7PN3T+jqMU1MBhpgn+zh/XlBtSpKHXeJ/O+B/V32LgJ5JAPhpZiekcn5Qm8ysC8oY9Sdvmn9hWlYTD7PmH3TziMCSdyamJhcwAHsgcLsrGFiEhjTGJ1jzMJVE5PAmMM0ExOTQYFpjExMTAYFpjEyMTEZFJjGyMTEZFBgGiMTE5NBgWmMTExMBgWmMTIxMRkUmMbIxMRkUGAaIxMTk0GBaYxMTEwGBaYxMjExGRSYxsjExGRQMCDGSAixWAhxWAjRqorwB1vvWiFEvhCiUG2DrS1PF0LsVpe/LoQwhYFMTM5zBsoz+hT4KvBhsBWEEKHAC8ACIBu4WQiRrb78K+BZKWUmUAt8u39P18TEpL8ZEGMkpfxMSpnfyWqTgUIp5TEppRt4DVik9kqbA7yprrcapXeaiYnJecxg1jMaCRjlEE8AU4AEoE5K6TEsb9fOSMPY3hqlA22XGj6eZyQCVZ2udX7yeb22z+t1jevphv1mjIQQm4BhAV76sZSyow6yfYo0tLcWQuzrqT7vYObzel3w+b22z/N19XTbfjNGUsp5vdxFOUo3WY1R6rJqIE4IYVG9I225iYnJecxgntrfC2SpM2dW4CZgndqbaQtwvbreEuCceVomJib9w0BN7f+PEOIEcCXwLyHEe+ryEUKIdwFUr+ce4D3gM+ANKeVhdRcPAvcLIQpRYkh/7OKhV/XhZQwmPq/XBZ/fazOvy48Lqm+aiYnJ4GUwD9NMTEwuIExjZGJiMij4XBuj3padDFaEEHYhxEYhRIH6Oz7Iel4hxEH1Z925Ps+u0tn7L4QIV8t+CtUyoLQBOM0e0YVru00IUWn4nO4YiPPsDkKIPwkhzgTL2RMKz6nXfEgIMalLO5ZSfm5/gItQkrA+AHKDrBMKFAFjACvwMZA90OfeyXX9GnhI/fsh4FdB1msc6HPtwrV0+v4D3wVeVP++CXh9oM+7D6/tNuB3A32u3byuq4BJwKdBXv8isAEQwFRgd1f2+7n2jGQvyk76/+x6xSKUMhg4/8thuvL+G6/3TWCuWhY02Dkfv1udIqX8EKjpYJVFwBqpsAslL3B4Z/v9XBujLhKo7CRoeckgIVlKeUr9+zSQHGS9CCHEPiHELiHEV87NqXWbrrz/+jpSSfmoR0npGOx09bv1NXU486YQIiXA6+cbPbqnBnNtWpcYLGUnfU1H12X8R0ophRDB8jNSpZTlQogxwPtCiE+klEV9fa4mveKfwKtSymYhxJ0oHuCcAT6nAeG8N0ay/8pOBpSOrksIUSGEGC6lPKW6v2eC7KNc/X1MCPEBcBlKDGMw0ZX3X1vnhBDCAsSilAUNdjq9Niml8TpeRokHnu/06J4yh2lByk4G+Jw6Yx1KGQwEKYcRQsQLIcLVvxOB6UDeOTvDrtOV9994vdcD70s1UjrI6fTa/GIpC1GqDc531gG3qrNqU4F6Q1ghOAMdme/nqP//oIxXm4EK4D11+QjgXb/o/1EUr+HHA33eXbiuBGAzUABsAuzq8lzgZfXvacAnKDM4nwDfHujz7uB62r3/wGPAQvXvCGAtUAjsAcYM9Dn34bU9ARxWP6ctwPiBPucuXNOrwCmgRb2/vg3cBdylvi5QhBGL1O9ewJls/x+zHMTExGRQYA7TTExMBgWmMTIxMRkUmMbIxMRkUGAaIxMTk0GBaYxMTEwGBaYxMgmKX9X/Qa3qXAjxQUcqCB3sL0cI8cU+Orcu7ct/PSHEwvNBmeFC5LzPwDbpV1xSypw+3F8OSi7Uu/4vGBos9HpfHa0npVzH4E9qvSAx84xMgiKEaJRSRgdY/gHwAynlPiHENcCjQDhKktvtUspGIcQVwEogCiXpdD5KAlwkSmnAEygSLxkoEhvHgeXAn1B6ilWq+zouhFgMPAJ4UYpk56EkQBr3VaweLwJwAbery/zXi0RJwrtHCJEMvKgeH+A7KMmHb6CUMIQCP5dSvt6rN9Kkawx0Nqf5M3h/UG7+g4afG9XlH6B4G4koLcqj1OUPAj9F0e45BlyhLh+C4oXfhkG7B/gZsB+IVP//J7BE/ftbwD/Uvz8BRqp/x6m//fc1BLCof88D/l+Q9fT/gdeB76t/h6LUvH0N+D/D+rED/TlcKD/mMM2kIzobpk0FsoEdqryQFfgIRdDulJRyL4CU8ixAEAmidVJKl/r3lcBX1b//QlvR6A7gz0KIN4C3gpxLLLBaCJEFSCCss4tDqY6/VT1HL1AvhPgEeFoI8StgvZRyWxf2Y9IHmAFsk94ggI1Syhz1J1tK+e1u7sPR2QpSyruAFSiV4PuFEIG0jH4ObJFSXgx8GWW41m2klEdRVAw/AR4XQvy0J/sx6T6mMTLpDbuA6UKITAAhRJQQYiyQDwxX40YIIWJU6Y8GIKaD/e1EqWwH+AawTd0+Q0q5W0r5U5RYUkqAfcXSJlNxm2F5R8fcjBInQggRKoSIFUKMAJxSyr8CT6EYJpNzgGmMTDoi0m9q/0nji1LKSpQb/1UhxCGUIdp4qUis3gg8L4T4GNiI4qlsAbLVfd0Y4Hj3Arer+/omsExd/pQQ4hNVAH4nbRXuxn39GnhCCPFffGeJOzrmMmC2OjTbjzLkvATYI4Q4iBI0f7x7b5lJTzFn00xMTAYFpmdkYmIyKDCNkYmJyaDANEYmJiaDAtMYmZiYDApMY2RiYjIoMI2RiYnJoMA0RiYmJoOC/w86BG7EpgqaIwAAAABJRU5ErkJggg==\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "0.737853936239046\n0.17163767\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-11-14T13:07:28.903653\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAASMAAAEKCAYAAABZgzPTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB2dklEQVR4nO2deXhU5dm47zfLJJkEkkkIYQtkBRoVIgRBFpHNlhbRtqJdQb9atItStRutrXVp1fZTf9T2+5DPaqGLFa2tFKsWAVkFDAgIEchOEiBMZpJAZiaZTPL+/jhLzkxmkiEQEuDc15UrM2d9z8yc5zzvswopJSYmJiZ9TURfD8DExMQETGFkYmLSTzCFkYmJSb/AFEYmJib9AlMYmZiY9AtMYWRiYtIv6FNhJIR4SQhxWghxKMR6IYT4rRCiRAhxUAgxwbBuiRCiWP1bcvFGbWJi0hv0tWb0R+AzXayfD+Sqf0uB/wUQQiQDjwCTgeuAR4QQtl4dqYmJSa/Sp8JISrkVcHaxyS3AGqmwC0gSQgwFPg1skFI6pZT1wAa6FmomJib9nKi+HkA3DAeqDO+r1WWhlndCCLEURasiPj5+4tixY3tnpCYmJuzdu7dOSpnak337uzA6b6SUq4BVAAUFBbKwsLCPR2RicvkihKjs6b59bTPqjhog3fB+hLos1HITE5NLlP4ujNYBi1Wv2hSgUUp5EngXuEkIYVMN1zepy0xMTC5R+nSaJoR4BbgRGCSEqEbxkEUDSClXAv8GPguUAG7gLnWdUwjxOPCheqjHpJRdGcJNTEz6OX0qjKSUX+5mvQS+E2LdS8BLvTEuExOTi09/n6aZmJhcIZjCyMTEpF9gCiMTE5N+gSmMTExM+gWmMDIxMTkvnC4vL2wpxenyntdxTGFkYmLiJ1DOVbi8VljFk28f4bXCqu437oLLPh3ExMSkezSBoqG9vmdmdrf7LipI1//fex5jMIWRickVjNPl5bXCKsakDSA7NZ5JGclkDIoHFOGirV9UkE5yvCXoMZLjLWEJre4wp2km/ZYLZYswCf1Zrt5ZwZNvH+EX/zpMqd3FD14/QL27YxtNY3po7f5e/x5MYWTSb7lQtogrha6Ed+jPUmniekNuKqOSrZTaXfzkjY958u0jrN5ZwaKCdGaNSWXzUXuvfw/mNM2k32K0RZh0j9Huc8/MbL8p1ty8NHaVOZiUkcwLW0r1adeSqZlYLVHMzUuj1N5EpdPNiQYPANuKT7O3sp4H541mSlZKr38PpjAy6bdcKFvE5URXNpxA4a0JJ7e3jYPVDWw+aqfM7qLS6cbh8pISb2FRQTr3zMzmhS2l7Ch1kJ0aT6ndRXZqPPuON+rHnpE7qNevzRRGJiaXEIHaj5FkVbis3lkOCBbmDwPA7fWx+ahdFzQAh2sa2VHqYFeZg2duz9cF2Ny8NNbtr6He3Uq8JZJ6dytZg6zn5F3rKaYwMjG5hOhq6up0eXlo7X42H7UDcLC6gYcX5LFu/wmWzclhYf5w1u2vQRNUT6wvYvNRO4tW7mTV4gIWFaSrdiHBmg86Cjba4mNYNicHt7cNp8sb0qt2vpjCyMTkEqKrqetrhVVsPmpnWnYKQghVKCkCZ9aYVJZMzWTJ1ExeK6zCZrXw8II8DlTvpNTuYvnfD+JweSm1u5iWncLkzGR2lzvJSLGyMH8Y7xXV8uTbRzhY3cAzt+f3ikAyhZGJySVCdzE/gVOtiaNsLMwfRmvbITYftXP/K/uYOMrGio0lADhcXpyuVoYnxXKysZmqeg/J8dHsKHWwbE4OVkskm4/aea+olrl5abyy5zibj9pZvbOCB+aNvuDXZ7r2TUz6OZrLfvXOct09X2pv4q6X91BqbwKg1N7E/a/sw9HkZd3+GlXgSN4rqiVvWCIA20sc1LtaWT5/LHPz0vjP4VMAREdG6ILo0ZuvYtaYVGaOHkxu2gCuy7DhcHlZt/8EFQ63OiLZK9dpakYmJv0czWi9bE4uy+ePZVFBOve/so/tJQ5a2w7x6C1Xs2jlTpyuVraXOBg3IpFlc3IAoe6XQ0aKlQqHm1J7E9+bN5qH1u6nwuEmOT6aX9x8FS9uL2d7SR2vFlazvaQOQLc97amoZ+mMTJbNyQUkS6Zm9sp19nUN7M8AK4BI4EUp5VMB658DZqlvrcBgKWWSuq4N+Fhdd1xKufCiDNrE5CIzNy+NrcfseFrbWDI1g+R4C3lDE9le4iBvaCJPrC/C6WolQkC7hIPVjQyMjeLRW65G0WIEv7j5Kn725iHcXh8rt5Sy+aid5PhonK5WjtaeJW/oALaX1JE1yMqMXEVzGjfiBLvK6thdXk+cJapXpmZG+kwYCSEigd8D81CaMH4ohFgnpSzStpFSPmDY/j7gWsMhPFLK/Is0XBOTi4rRPvReUS07Sh3sKHWQohqw770xm5QExZWvpG8UMTA2ijcPnASUKdnqHeXsKHVQancxa0wqVfUequo91DV5mZ4ziO0ldUzPScHtbQMhAMVzpgVMgmT8CBtTsgaxZGpGr19zX2pG1wElUsoyACHE31DaWReF2P7LKN1DTEwuWcJJPAX/eKJFBem4vT5ABHXp26wWpmSlMCkjmf1VjVQ6FdvOP/ef4Eyzj4wUK7mDE6g900zRybNU1XuYf/UQZuQOwu31sWJjMcvm5OhTQO38mqF7+fyxvebON9KXwihYi+rJwTYUQowCMoFNhsWxQohCwAc8JaX8Zy+N08QkJEbhAnQraEIFLQYKKaNnbPXOCjzedkCyemcFS6ZmsHpnBSs2FuP2tmG1RPLk20fISLFS6XSTGBdFo8fHmWYf2anxzBk7mFXbyhmVbNXPF2eJ0jUgqyXKb8xOlxe3t42lMzKJU9ddDC4VA/aXgNellG2GZaOklDVCiCxgkxDiYyllaeCOQoilwFKAkSNHXpzRmlwxnGsdIE3LCQwgDBRSWjzRC1tKWbGx2O8YVkskHR4tyaKCdHaVOXSD86fzhnCisZm8oQO498YcAFISYhiTNoBH1h1m5phUfdoVLG5J0YqKWT5/7EVNx+lLYXQuLaq/RED/NClljfq/TAjxPoo9qZMwklKuAlYBFBQU9I5P0uSKJVhEdFeaRHK8BasliiffPoLVEqnf7KEiqxXh1YbH2wZIEAK318fM0YMprKjH09oOwMML8iiv+5AKh5uhSXH8etF4v+PcMzOb5zYco9LpJjY6Mqx4pYudoNyXwuhDIFcIkYkihL4EfCVwIyHEWMAGfGBYZgPcUsoWIcQgYBrw64syahMTA4GaRVeahDYVm5uXBvjf7NpxnC4vz204hsfbRpwlgiVTM/28WC9sKVUjoRt1o3ZctKIpVTjcTMtO6cLYrDyLtby0UOPtqwTlPhNGUkqfEOK7wLsorv2XpJSHhRCPAYVSynXqpl8C/qZ2l9X4FPCCEKIdJXDzKaMXzsSkrzAKHC1y+b2iWj3v68m3j+jJqUYbzWuFVUzKSOYHrx/Qk1kBrAbbjlGQzc1Lw+s7pAoVxX0PUJCR3Om4wcqFaGN7bsNRQOghA8H2u1j0dXvrfwP/Dlj284D3vwiy307gml4dnIlJDzAKnM1H7X62HKNt57XCKl3IaMmtWlZ9RoqVm/KGAErGfam9SU9qBUUQPbG+iIduGsMNFU5dw7JaIv20rWDCT9N4smcmqPaoEn1fbV1XlQF6k0vFgG1icklg9IJNyarV/2taxjO353fyvmmJrPfNzuX5TcU8vCAPm9WiR1m/qaZizBqTyqKCdL/M/Jfvui6kJrOoIJ2tx+xsPmrnvr/u4/mvTOi0PljIgBZk6VA7hVws7cgURiYm50B3UxjNLW/cJntmQsjjGY3FyfEWXr7rOkCxDW0vUew6miB65vZ8AHIHJ9DaJnl4QR7QtSajxjKyo9ShlwrJTk3Qx/rAvDGdxhQsyPJiYAojE5MuCBQ+xvieUOkRXQmHUC78QDStxeNtJ84Sqdt0XthSyqpt5Sybk8O6/SfwqJrNsjm5nbxfrxVWsb3EwfScFKrrPZTaXTyxvkgXeKHoLsiytzCFkYlJF3QWLB3xPaHoyjUertvcqLU4XV418NEHQuhJsMb4o2Vzcvw0NS1wcdmcHJZMzaTe7eWJ9UU8vCAvLO0umMbU25jCyMSkCwKFh9EjZSxsb8So7SiCRCkDq2k3gZpQd1HcWhCihjFtQ0tk1bxpGsbAxeR4i5+9yu1t04/Xn2qMm8LIxKQLAoWHMTI6nLSO1TvLg3qsjHQUzvdxsLpRN04bAyKVwEcfza3tbD1mZ25eGg/MG43TleEnyDSMhnRNaHaUIvHPQ+svmMXVTEy6IFQvskUF6foNbdymc38yRWOZnjOo07ba8bXpFAjdsxYYELlkagYpCTGU1TWxo9TBE+uL9HWa7cmItlwrF6sJrOXzx7JkambQffoaUzMyMemCUMZoo8Zk1JICp3UL84ext7KevKEDgh5P05yWzsgizhLBsjm5fgGIgeNYOiOL6MgI3ZOm0ZV7X/vf31s/mcLI5Iok3CjjYNOdYP3K3N423F6fX2toUNzk20vq2F5SR0pCjH68SRnJ3PXyHtLVTPqik41sL3GwbE5ul0JFi562WYMLKwgtNM/12i82pjAyuSLpqvuq8QbtzkakbaOV8fjTrkqcrlZ9u0UF6ThcXg7XNDI3L00/3l0v72HzUTvTc1L0mtTvFdXi9vo6ncc4tlBC51ySW/sqwro7TGFkckUSqvsqBL9BtfbQWm5YsOOtLayi1O5iVLLVr0RISryFHaUO3iuq1QMglWmW4mrXghCzZyb41RfSCCy0ZvyvcS5TsJ5k5V8UbUpKecX8TZw4UZpcnjiaWuTK90uko6mlV/Zf+X6JHPWj9XLl+yUhj1Fy+qy886Xd8pfri/y2DTz2uY71XLY/388hFOFcv5RSoiS59+j+7HMBcTH/TGF0+aLdLHe+tPuC34hShr7Jgy3vbtmz/zkiR/1ovXz2P0fO6Zza+70VTnnnS7tlyemznfYJV2iEe33hrtc4H2FkuvZNLgsWFaQza0yqnhEfimCu+lDue+M6IKg7vLMrP7i73X87LUDRP1AxkMBja+9/8PoBNh+1s3RNYZchB+Fef6jrMBIqhOBCYtqMTC4LgmXEByOYbehccsmMKDFCPpbNye3S2wb+3rDVOyrISLEyc3Rql9cUaKcyeuK0ukerd1bopUO0SOuubEcXwgDeifZ2cDiguLj7bbuipyrVpfhnTtNMwp1WhbPOOCUKd3r0y7cUe5JxShnO8UONS5vyhTst66lNKeR+DQ1S7t4t5Ze/LGVk5HlN00zNyKTfcqE9ON2577UpjNHDFsp7Bv7xRQvzh+vLujrv4ZpGAGzWaB5ekKcHPbq9Pr/k1FBalzauRQXpnbp7hENP4446aVTNzXD8OPzf/8HKldDUFNb5u8IURib9lgsdD9Pd8YJ1+jBWauwqvmj9wZOsWlxAcryl081tPO5jt16tZ89npyboBfXr3a1+0zytb9ny+WP1lA7juLTxnE9UtTbOcBJn9Wlc/lA4eRL+9jfa/vsZIk+oPTQSE+H734ef/axHYwFTGJn0Yy50l4rujme066zbX8PSG7JASsaNSNLzygI1iLl5abywtdSvVlCg0AtWQE03jEulFEmZvYk1H1Tq+xjtRVq0dTgdSIKNMZTmcy6Js8nWaO65xgb/eQt+9SvYv59IoDUikrJ5tzDmieUwduylK4yEEJ8BVqAU5H9RSvlUwPo7gd/Q0cLod1LKF9V1S4CH1eVPSClXX5RBm1w0LnQuVXfH8+9VVsL0nBQ1RSNHL2wWqFmt238Cp6uVdFscuWkDKLU34WhqYXrOIL8pntvrY+X7pcRZIlmYP0yvab1sTq5fBLYmEN4rqmXzUTtTsmq5Z2Z22B1IzsVAHygkQ9LUBPv2wdNPw787StZ7Z8/h3c8uZvoX50D6EIiMDH2MMOgzYSSEiAR+D8xD6Sb7oRBinezc5eNVKeV3A/ZNRml1XYBS5Wqvum/9RRi6yUWir3KotBrQbq/SM3RvZQNOl7eTZlVqb+LN/cpzcmSylVVbyyg60aiXi311TxUpCRa1hXSJfvyD1Q16Af6F+cP8IrA1eqoVdtXH7ZyjtltaoLQUnnsOVq+GViXNhauvhuXLscyezc0pKRAdfU5jDEVfakbXASVSyjIAIcTfgFuAcFoOfRrYIKV0qvtuAD4DvNJLYzXpA/oqh0qrAQ2QnRrP9pI6vZuHcRxPrC+iwuEmI8VKdmoCQkBWaoIujN49fIpKp5tlc3JZNidHLyG7MH8YoGhGxhQRjXOZagUSTMCEq2Hq57h2GMlnnbBqFTz/PNSrz/ghQ+CBB+DLX4bBgyEmpttjngt9KYyGA8YIq2pgcpDtviiEuAE4BjwgpawKse/wYCcx21tfulyszqbB+ty7vT7FuCwlcz6ldHEN7JTx8II8WtsO4/W1sWaXYu/JGzqQadkp+Nolu8udnbQf7XzjRiSGtEWdayzUhWL1zgpeXr+PzH+WctO6l6CsTFlhtcLSpXDvvZCerrzvBfp7BPa/gAwp5ThgA3DOdiEp5SopZYGUsiA1tesgM5P+RXdRv11FTndF4H6B0cdaDei46AhWbSvn7Y9PsmJjCSu3lPrtl52awMRRSeypqCfdFsfSGZnEWaLYUepgSlYKs8akUmp38V5Rrd/5NU+Z1RLpJ3y08weLou4usvp8Pg8A3G5GfbiFl/7+GDf9v4cVQRQRAYsWwaZN8NhjMGZMrwki6FvNqAYwfrIj6DBUAyCldBjevkhHC+sa4MaAfd+/4CM06VO05oXGzHYjPdUWAmN7Qmlgmtu9qt4DwNsfn9Rf3zMzW7UZndC36ahXJPF428hNG8C4EYlBS8K6vT49sz/wfWANbWNcUVf06PNobYVDh+BXv+Lzf/87QvXuMXUq/OQnMG2a4rYXXaeuXAj6Uhh9COQKITJRhMuXgK8YNxBCDJVSnlTfLgQ+UV+/C/xKCGFT398ELO/9IZtcTDq6qAZvr9PzaVxHblhXtpi4aGXikG6Lo6reQ1W9x68krNFmdEv+MCXVY2cFu8ocapF89IL4RpT4pCiefPuIXhc78L1GqJbYwTinz0NKJWjx2WfhxRfB7VY+lexs+PGP4dZbITlZ0Y4uEn0mjKSUPiHEd1EESyTwkpTysBDiMZSQ8nXA/UKIhYAPcAJ3qvs6hRCPowg0gMc0Y7bJ5YOx5k8wgjVMDIclUzOwWiKZm5fGfX/dx45SR6cIaGW7jk4g6/afACRLpmYCSqnZ+2bn6uO0WS1+nV4BJmfa9PbUmtteG2Og4AgmSLT62NOyU/xaYoci7FCIxkYlcvq//xtq1SlkcjLcfz/cfTekpUHUxRcNfRpnJKX8N/DvgGU/N7xeTgiNR0r5EvBSrw7QpE+xWS1MyUrBZu0c1azRk6mJMZ5I85rtrazvZKDWtiu1N3GwuoGHF+T5xRstm5Ojj09rU52RYqXC4WZ6ziAmjrKxYmOx3vHD7fXpqRvBUlACu4xowm3ZnFxuGJ0alsbTpdetpQXWrYNHH4XDh5Vl0dFw553w4IOQlQWWvitDa0Zgm/RbgqVnAH7aUKBG0dXNGLhOiyfytbezvcQRUvMInC5q53J72zpVYJyUkczzm4p1bUmxH7UzbkSS3zV05SUzCqLpOSmADFvzCyqc29pgzx74+c/hvfc6Nv7sZxW70MSJEBvb5XEvRsyXKYxM+i2hUiICb7hgNhZtnZHAdVo80bI5ucwem9ZJ89BuQON0TENrPa21lTZqW8bIaaslihUbj+ieMK3ch0Zgwf+5eWm68Js1JpVxI5J07cpoMwqnGwhSQnm54gn7y1/A51M2uvZazv5wOWuTxvL5/DEkx/ZQyF1gTGFk0m9Zt/8Em4/aGTfiBA/MG+3X1ND430gwz5RxXaj/gTf53Lw0fv7PQ6qwyvEzoGuueegwUBv36+ocoQIStamflpg7a0wqz9yeT73by/qDJzrZjLrtBlJfD089C7/9LZw5o6wcPhx+9CNYvJi/7q/jybeP4IuzhiVcLkbMlymMTPoxwfvad2WoDeapCrVfMBe6o6mFVdvK2VZsD2lP0gQeCF2jCZX5Ho5RudTexLbiOpbOyOSO60YyJasjR+2J9UWU2l2dGjuGFA4tLfCnP8ETT0ClEohJQgJ8+9uwbBkMHQpCsKggLvj+IbgYPddMYWTSb1mYP5yD1Y16raBw6Uo7CobRRpORogT15Q1NZOIoG7vKnGwvcbB6ZwVLpna0ktY8b0Zj9rI5uTiaWnhuw7FOjRi7srk8sb6I7SV1AH5eN23Kp2lJwYzrOu3tsHGjYgMqLFSWRUbCHXfAww/D6NF+iaz9saGjKYxM+i1a5vq4ESf8SqsaCXaTd6UdBdsnmCfsjuvSea+olvEjkthd7gRk0KmRUUNRpm8dpVeNY+7K5qKFMOQOTuiy9EhIiooUIfTmmx3LbrxR8ZpNnXpB3fS9acg2hZFJv6XDa+XT7SkPL8jz0x56UtM5VL0hbYo2cVSSXtBs6YxMZo1JZWH+cGxWi17ZUdO4jLFOkzKSmZadwlXDEwEZUrAEkp2aoNc4Mnad7VZ7sdvh8ceVhNaWFmXZmDHwi1/A5z8fdiLruQgY7bMLDFO4EJjCyKTfYozF0WJ1tGx36Pom7+pGDvRgaTE+gcIAwNHkVbWzGh6YN0av7KjdiEqlRKVEyKwxqewodegxQcZysOFMi8KeOrW0KNn0Tz8Ndcr0jtRUeOgh+M53FBvROXAunrJgYQ0XarpnCiOTfovxia11/piUkQyge61C3cChnvZOl5eVW0o5XNOIw+Vl1dYyv1QLo0HbiGbENtqjtBw3Y4E0zfjcE5tMtxqKlPDGG/DTn8LRo8qy2Fj45jeVadqQIed0Po1z8ZQZHxCBYQrnS3/P2je5gjFms2s3wYcVTr0OULj7Bi5ftbWMHaUODtc06r3WVu8sD5rJH2eJZNaYVD0oUrNHrdhYzN7KepbNyWXJ1AzumZlNdmqCXmWgJxn0XfYuKyyEOXPgtts6BNHnP68sX7Gix4IIetYTrTf6qJma0QWir6oSXs4Yn9ih4ni62lfTYPZV1vP8pmLum52L2+tj8ZRRlNqbeOzWq/VUjsBpR6C2YOzHtqggXY8HmjjKdsHSVIJFk7/17z0s+udKYl/9mxJJDXDddUod6lmzei2RtS9+z6YwukD0VVXCK4VQaROhbhijR+1Puypwulopr3NR4VAqLz4/bwKrd1ZgTH61WiKZlJHMXS/v0aOu691e1u2vwdj91dgwMlCIBROaParS6HZT/u0f8oVX/kBsa7OyLCNDMU5/9athecjOR6D0xe/ZFEYXiIsRoXqlsXJLKau2luFwebk3wJUOwctrGG9AowaTnRrPtOxBVDgq0dz0Rjc8CDxeHw+u3U+Fw81xp5tSu8uvVZEWJmA8h7bcqEEF3sTBCvmHREp4+WX4+c+ZWKOU92ofOJCI739fSWaNjw/78zsfgXKusVoXAlMYXSD6YxDZpU5hhVIVZvux0xTXntWz5jWMwmb1znKslii/4vf3zMzu1PLaFh+NFjmtFNyXgPATTNmp8fzmtvF8WOFkbl4a40YomlEogdNdSEHYD6r331cEzkcfKe+jo2HxYiIeewyGDQu6S1faz/k8ILuL1eoNTGFk0u+pqvdQdKoJr+8Qf/nmFH15sOmSVvze+ETXXPBz89IorKhX0zykHkWtGZk9Xp9S0VBKthyz61HUgXWOjAm8gfSoIH5xseKW/9e/OpZ9+tOK6378+JC7GSPHIXiTyfMRIhdb2zeFkUm/5ephiew73kC6zUrRqbNqMKE/wVzNmuaiPdE1F/zWYx35Zicbm/06uD4wbzTgP6UKpREYe5ppnT16ZJ9paFDKeqxc6d8G6Ne/hvnzu91dixwPzFu7UFxsbd8URib9nquHJ3LLtcO7vOGMN07nJ7pifL5qeCI1DR4qHG72lDtZW1gNdDY8a0mwoc4XTGMItzxsqb2JJ/95kKdObGHQb/8bnGqB0iFDFOP03XeH3Qwx7HSRMOlrj7ApjEz6LUdrzwJQ6XTz489+yu9GCbxxnC4vq3eWA0KP+wFtCib1eKA7JqXzxPoi7pudy4cVzqB2oMBpWVcYhZhmvwpZHlZK3nrsf3j4z/+PQQ1qaXerVcmm/8lPzjly+lw0l2Cfl9GWpk11g1UeuFj09/bWDwJ3o9TAtgP/JaWsVNe1AR+rmx6XUi68aAM3uThonSpk5yTVwBwp/66t0i9dQ4uS1m4+rTbRhFFKPwel1rRPL5SmEeoG1m7aXWUOcgcPYNW2MtzeNj9jeSctY98++N73uH/bNgDahKBszs3kvvx7GDHivD+q7rSaUJ+fhlZ5QCsCd0XFGYXZ3vojoEBK6RZCfAulVdEd6jqPlDL/Yo7Z5OKyp7Je//+/Xy8A/CsiAn6G66UzMik6eZZ6d6tuI3rs1qvV7Xyq8GrrVAEgmMACOhmHtRt42ZwcPXJba4Ht8bb52a+0fa11tXz9n/+rVFpUhWvr1GmsW/J9Zn31s3CBbnSjcNGEsPEauyosp2Hc/pzCES4Q/bq9tZRys2H7XcDXLuoIL3P62kbQHSMSY6lqaGZEYmynioigCKZH3jzM0hmZLMwfZqgLpNz0O0odvFdUazBwR+Fo8rJiYzFub5ten2hSRjKzxqTi8frUdT7d6zYq2cqkjGRdAGrhAA8vyGNKVi2OphZ2lzuJs3REQr9WWMUHh6pYUfxvFv72b+BxKytycuA3vyH6llv4Yog+ZD39TgJLmQQKkq4Kyxm3C3a8i8Wl0N5a4xvA24b3sUKIQpQp3FNSyn8G28lsbx2a/h41bolSbvDICKF7viZlJJOdGs+YtAF8448fUuFwU13vJs4SpXuWHl6Qp7cWCpxyrHxfmcptPnKKN/fXUOFwk50aT6ndxbgRSSybk8uusjq971ml083zm4r9Ah+1rH2jMNSiuGlv56ufbOJrf/wp8U61bVFKilLg7LvfxdnSzmtby0LavsL5TkLVcAqnLG+49EXc3CVhwBZCfA0oAGYaFo+SUtYIIbKATUKIj6WUpYH7SilXAasACgoKZOD6K5n+FjUeeJNVq91bj9d7ePLtI/x193FSEiyU2l384l+HqXAoGkeFw43H26bbO4yuevCfcsRZlJ/8wRrFOJ4YF0Wp3cXkTJuuKWmCaHJmMlOyUliYP8yvFCwon9lDa/ezvaSO6EihCIXNm+F73yPh4EFlI4sFvvUtxUuWlATAaztKQ9puQpVEOVeB1dN+cn1Nv25vDSCEmAv8FJgppWzRlkspa9T/ZUKI94FrgU7CyCQ0/S1qPPAmG2GLo7TOjSUCmtsULaW1TWk5PX5EIiNsVtzeVvYdb6ToZCOP3nJ1pxtQa4S4bE6O3w1e72qhrM7NGU8rB2saAaHfxG6vD09rO3HREXrgY/bMhE5CQavQ+GieBW6+Gdav77iYW2+FZ55RepEZCKylFJj4G+w7CbQHBTO2d/dZXgr09/bW1wIvAJ+RUp42LLcBbillixBiEDANxbhtcgnTSStQzSrNbTBhZBJx0ZFkpyawZlclVfUe9h1vYMLIJKbnpLC9xMHSNYV6PplWEVLzshm7eFgtkSyZOobkeAu/eusTDtY0Ml7ta6ZFXGva1N7KeiaOSta1JuMNnh3p5eW9a2DpC3obIN+Eiay/64fccNetQTWSYLavcAuaGb2Dwdpmg3+ogd9neQnQ39tb/wZIAF4TisFPc+F/CnhBCNGOUpPpqQAvnMklSKBWcNzh0V8XjErmJ5/7FE6Xl+G2ON45pMTp7DvewNIZmURHRrD5qJ246Ai/ipDGwmdKFw9FOGnBiffemE1KgqXTTWvMe9teoqSPaHahRePSlNbQv/ylEkUNNA0eCk89xV8yp/LkO0dZHirWyHB84/9wP5fu9rsUNSKN/t7eem6I/XYC1/Tu6Ez6mrb2DhNfc2ubwaPlo81g/YuzRPHM7fksWrmTUruL7NR43ds1KSOZZzcc5d3Dp9h3vIHJmclMz+noXR/qptby3u5/ZR/bSxzsrWxgyfWSe+r2Q8EPoawMgJa4eNbM/BL/fdXneDBrnBL8WO4Mmrd2Megqb66/06UwEkIkd7VeSum8sMMxMemg3fB6a7GdCofbr6QHwIDYSE42uFm9s4Lf3Dae5zcVs+T6DJ5YX8TDC/JUd79D3353uZNlc3KYkZsa0g1uJG9YItX1Hhq3fYD3/30bDu9TVkRGUvTZRXwt42ac1kSyU+P14wXmrQWjpxpMd/sFy5u7VOhOM9qLVmMBRgL16usk4DiQ2ZuDMzHRqHC4GZYYS7rNynUZNvZUKB6vs81trN2r+T0kL991HV97cRfbSxy4vQcZP8KG2+tjzJCBxEZFEGeJYmH+MNbtP6G6+UVIY/BrhVX8a/1ufvz+H7nlky36cu/cefzj6w9RMH8at+05TtHJszx6y1W6ARxCT6PO16YTaAAP9Jb1Nw/pudClMJJSZgIIIf4P+Ic6rUIIMR+4tddHZ2Ji4ERjM2t2VbJsTi756Um8sa+aOlcrg+KjqXO18sa+GjzedrJSE9he4uDIqbPsLq9n1phUvjd3NPVuL0+sL8Lj9bFqW7l+3GVzcv28b6t3lhPtdvGV91/hGy/+lqhWtY71VVfBc8/xsiWLJ98+wqy2opDNFbUa2N2VozVup63vyh3fnQE8XA9pfwx4DddmNEVK+U3tjZTybSGE6b0yuWhERkBbO9is0cwcncqWY3bqXErZDU9rO5FCqXu0alsZy+bk6A0ZbdZoNh+18/82HGXt3mqaW9tVV78xuLHDAPX67gpOPfM7frDtTyS7G5WFgwcrxuq77oLISBa5vN0mxYbbz82Y7T9uRKJfYbiuOF8NqD8ausMVRieEEA8Df1bffxU40TtDMrmSME5btFrTga2hASyRglag3t3K3Ws+ZME1QwGIihC41PwwAKtF8Ma+GiaMTKTC4SYjxcri6wfz5v4amlvVGKX0JB6YNxqnK8PfiL1hA/+17HtEfaI4ZttjYlk/78tc/dtfkZXZ0X3DWNTtXMqMaPsGCidNsI0bkaQHbobzmWnbBdPAutN8+uN0Llxh9GXgEeAfKI+RreoyE5PzwqgZBNaaNuJpVbSXCAFOVytbi+v0+KKYKEGLTxITKXB7JW6vh8gIoSezfubqodxzQxY/e/Mwcz81mHtn+texTq4sUSotvvNOxw3xta/x/fzbecMewaz3j/OyQRhB8OlQoAAIR+MIJti6mz4Fy7gHfw0nnCjtC6URldqbdIfB+RCWMFK9ZsuEEPFSStd5ndHkiiOcOs3Bak0bSRsQQ+3ZFsYOGYDb20aFw83gATEMjI3iTLNP/z9u+ADONLfx7O35ABx3upmUkcwPXj+Ar12yR62r/VphFate38X0Z39O8luv6m2Aqq+eyJZ7f8L8OxfwHbeX+m5uMuO1BbMHnWtXkHCCIUNl3He3TW/xxPoiPbbrfAhLGAkhpgIvogQgjhRCjAfukVJ++7zObnJF0NVT2ngjdlXUbOboVN47UkvRybMsnjKKBk+N7lEDSIhRhVJcDM996SreK6plW3EdpXYXz28q5je3jefuNR/idLXyxo4Svr7rH9z1hyexeNRna3Y27975fe45OwKqBE2qLUjTWmwFlm7rBIWyBwW77lCEI0S6y7gPtk1voqXFPLwgjz+ex3HCnaY9B3waWAcgpTwghLjhPM5rcgVxIZ7SGz6ppd7dSnZqPIdONNLgVtIvhiTGMtIWx7dvzOHxt5QSIj//5yF2lDq4Nj2R6TmDeHhBHtmpCbx2z/X85+crWPKNbxFdrRaMSErCtfxh/jrhs8wen87SPVUUnWzUXe/daTuBpV+NAmBuXhrbiutwNLX4daoNx1t2obgYXrPs1AS9YN35EHYEtpSySvjXYGkLta2JiZELcYPVu1vJSLEycaSNtw+f1JefamxmWGIs//N+CaV2F9OyU7hqeCI7Sh18VKW0r7ZZLfDBByR841t865MDyo7R0fCd78DPfsafP67nybeP0B5tIc4SwfYSB+v21/DAvDGd4nrOpTTruv0n2F5Sx/aSOlISYoDg9p2u6KkwCaxKGayoXH8j3N64VepUTQohooUQ3wc+6cVxmZwDPenrfqkRFSG4KS+NtXurOdvcRkxUx4Nx3/EGfcpWkJHMZ64aQkaKlXHDB1K8+2NOfeYWmDqVNFUQNX32Zl55+W2cTzwNycksKkjX89f2VjaoR1WOrwnS94pqVUEi/Txemub0WmFVkO9BMbpPy05hUUG6fp5z0RCNxz8XOjQ6Zbwge3Scc8Hp8hKZkNzjPJRwNaN7UWpVD0fJsP8PYNqL+gn9JWbkQk0JtOMY8bVLEIJxwwdysOaM/hRNjbcw1BZHpIBJmSnMHJ3KN1Z/SJuznrv3vcHtO9/A0qZM6cpGjWXQC7/jDxEjWLGxhE/ij1JV7+HhBXl+9YlmjUllydQMv7EYI6ZDRTwHfg9Lpmbqtbi1fXrS2dX43zimrj7nwOljqb2Jg9WNvZqz9lphFZEJyT0u6B2uMBojpfyqcYEQYhqwo6cnNrlw9Kbn5FwEzIUSilqfs05IyYDYaAA8PkXrsMZEcbBaCU5Mslo4VGHnc9v/yYPb/0Ky5wwApwak8PQNS/jnVTcy6mAEN+QqwZJbi+vUAm1FTMlK0StFGqOqu2tB1FVG/YWYnnZX3yjU8QP3uxg5a4sK0vlOk7O6p/uHK4yeByaEscykD+hNz8m5CJgLJxSD14dubm3nmzOy2FXupK1dMjA2iufuyOedw6d4++AJ+Pe/+fW2lxlRe1zZ3hLL7ybfxouTbiV1sA1Z71GFj1JaZOboVJ7fVMzDC/IUuxLBNZ9Q0daBgjrwewgmyC+E9tjV52zU5N4rqg1qaO8tkuMttDU5a3u6f3dZ+9cDU4FUtW2QxkCUGkQmlzk9rbsT7k0XrB2Q1udMMxRrvL73OK8WHtdLi+QMjifRGk3zh3t58uX/ZnqlYhNqFxEcmPd5bM88zf5ddppLHMwak8qRU2c52dhMhcON1RLJhFE2nrk9n9U7K/B4fXpJ2sAxBQYlKvlrFRRWOPUOteGmhIQS7ucipLp6+AQLIr1nZvYlkbPWnWZkQYktigIGGJafAW7rrUGZ9B96qnWFq1Gt3lnh161Da/GjGF39cbf6lzCvKiqn5gu/5hfb1xOhGou3ZuTzy9l3M/MLs4k72Ube0EQmjrIBgj0Vx1k2J0e342jjNAo9q0V5xhrHHihkjS2MAltLG2/mroITA4X7hZriGr1/gXW7w6Ev7Y/dZe1vAbYIIf6oNU80MQmHUDdd5yevJmCkXgtIu8GNKQ9GYlub+eaef/Ct3X/H2toMgCM9C+/Tv2ZV03COljpIPdmo1zHq8GAp1XCMT32lpnSbrhl1FdUMHf3tJ2faiIqI4L7ZoXutacvq3V69JZI2LQyctl2oMrFGwRmObairuKmLTbg2oxeFEIuklA2g16D+m5Ty0702MpNLmlAaVeeIZcGyOTkdrX4I3TteyHY+f3gzP9iyhqFNiqBxxCXyv7O+zstXzWNgcSzP3Z7FjNGpauKt0q5obl6a6p0TuhZkjLkxdhLRCDWF0m5SLX7HYmhjBPgJ08Apk9YSCYr0IMHuDOThcD5Tq0BNqC+bNIQrjAZpgghASlkvhBh8vicPo711DLAGmAg4gDuklBXquuUovdTagPullO+e73guBOH8MHpqTznXMQQaMbs7dk/PZ0yUzE71fxo7XV5Wvl9C0cmzPDhvNI6mFqbnDGJuXpo+RZueM4glUzsEWKm9iYfW7vc7zpTjB/nppj9wTa3SAKYlMpqXCm7hf65fRLQtkTa3j3p3K0v/VEicJZIxaQN4YN5oSu1NeqH+JGsUtxeMYFeZg93lTjYdOc2UrBTdkH3f7Fy2HLOj1bsO9KiBcsMq/dIOsXRGFndcl86UrFrm5qXx6p4qpuek6JpP4JTJqBlpn43b62N6ziA2H7Xz0Nr9XQok7XO+b3YuH1Y49eNrpXHdXh9Lpmae03d4vprQhbQxhSuM2oUQI6WUxwGEEKMwFoHpAWG2t/4GUC+lzBFCfAl4GrhDCJGH0k3kKmAY8J4QYrSU8qJHhfekCV+48/JQqQjBhEywhM1AI2awYzuavBSfPqt30+hJA0FjomRgWsBrhVV6IbOik4041RpEq3eU62PbXlLH7Gc2c1PeEGKjInnjo2qaWpSvMsNZw/L3X+bTxbv0Y/5r7AyevvFOqhPTiBQgmpU4IgF42yRej4/7XvmIggwbjZ5WSu0uIgQ0uH3868AJPGopkd3lTnaXO3ljXzVV9R52lTn0dbvKHEzJSmHJ1MxOdaW1UrbRkRFkpyZgK7Bw/ysfqd1s4dU9x0lJiNG3t1k7Cq5NyUrRPXdap49lc3IAyeajdr7wPzv4w52TdKFu/M61ppV7K+s50+zD0dRCSkKMPh3dq7YDD7cmEoRXfaCr38CFtDGFK4x+CmwXQmxB+c5noHZpPQ+6bW+tvv+F+vp14HdCyUm5BWWa2AKUCyFK1ON9cJ5jOmcCv4xwbCWBKQbh1pzpSsgES9hUMuFP4Ghq4ef/PESpvYnHbr0am9WiaygHquvVAmOKZrP1mB2Hy0upvSmoVqWdx5he8PCCPFrbDpNui+NX//4EpCTOEsXM0am8e/gUqfEW3L42nK5WBidYON3k5U+7jutPswgUQbG2sCNEJdFzlmU7XuHrH71FdLsimPYOG8sTs+/mo+Edxu02if5YHJ0WT3W9B5e3nXbZzuajdoYOjAWgXUJsVASe1nam5wzC62vTo7ZTB1ioqvfgaW3Xs/93lyufy8HqRnIHJ6j1hpQUkYcX5OH1HSI3bYD+vWqCCOBAdSO7y528sue43mjS2LBx6zE7BRnJLMwf5vd9bS9xUOFw88T6It2D53B5WbW1jG16TBScUYWvUu52JNuK63B7fWwvcZA3LPGco7zh3ARMV8nB50O4JUTeEUJMAKaoi74npazrap8wCKe9tb6N2tqoEUhRl+8K2Hd4sJP0dnvrUIFugWVHA7/gcHpnBSvEBcE9JUpSph1Hk9fveFZLpJ+36In1RYwbkahrK0tnZBEVEUFu2gBe3VPFjlIHO0odFJ1o7KT6a505lt6Qpbu13V4fIPD62liz67jf+LX20UY8rYpgMarVxsL70W2tLN73Fvft/BtJzU0AVCUO5qmZd/HW2OkgBBFCES4aCTGRXDVsoN4JNskapSfSzhg9iA9KHVTVe/j0VWkcOnGGB+eNJmNQPKt3lgOChfnDWP73g+ypqNez/ydnJhMdKdh81E55nZLZv7eyQRfSBRnJrNhYTIo6HdtWrLQ0ykixMiYtgd3lTiocbqZlp+D2tuF0ef1ilrSQAKXImxcQLJ4yirK6Jh5ekKf/XqZlpwCQN3QAE0fZ8Hh9NLe2U2pv4tFblOoE20uU2k4AcdERQX9LXWk7Rg+h1nMOQguYrpKDz4fu4ozGSimPqIIIOqo7jlSnbfsuyCh6ke7aW4djX+mKcAy1oTSmcDWkYOcK9JSs21/D9hIH20scFJ8+q9se5ualsfWYneG2OGrU1IdX9yjPgCEDYzhQXc/4dBurtpYxOdMGKC2fhyXGqUcWekT0xk9q2VNRz7TsFHaUKrE79e5W1nzQ4WgdNyKR/BFJlNU1MSwxtpMwavW1ExQp+fSxD1j+/stkNCiJsGctVp6fegerJ95Mm8WCNTICd2s7yVal5rVAEWpfuHYEtvhoQLC73EmDu0OYJMUpWg/A/qpGKp1unt9UzMt3XedXsmTl1wv0G1KLwoYO71h2ajzbS+r0KemyOTl+7bR/++UJ+rY3XRXF9JxB5A0dQJwlihUbi/WCcc/cns99f92nCiOp/1ZWbCxm+fyxPHbr1QDYCiz6b8P4u9R+r9+bN5rkeEvQ7TTC1XY0D2F2arwepd2VgOktI3d3mtFDwDeBZ4Ksk8Ds8zh3OO2ttW2qhRBRQCKKITus1tjhEI59pSeEkxrQk+6iGp2fdErUckaK1a8n2BPri9hR6mDZnBzFvmG10KxqJ6fOtHDqTAtah4xdZYqy2+jxUel0MWtMKjNHp/LshmMAnGxU3Oi+dsnSGVnEWSL1fbRqi84mL7Z4C9t3OVg8ZRSJcVE0enz6uJvbOpsarzlZzMObXmRy9WHl+CKCv+bP5/9N/wpOayIA+346TxeKn71mmN66aFp2Crb4aN32MiUrBe0mX7GxBCnRx2qMuA4kMLhReyhotXo0o7FRKw0sxK/tr0yZ6piRO4hFBen6dFbb7vmvTPALBwj1UAr24OnK+xX4gOpuOhUYVhBMoF1Muosz+qb6f1YvnLvb9tYo9ZOWoNiCbgM2SSmlEGId8FchxLMoBuxcYE9PBnG+QWKhOJenR6jGe12p1p2TMjOwWiL1WtJubxurd1boT3qPt50VG4/g9vootTf5HetscyuFFU52l9czIimO4bY4xgwZwJoPKmlta2d7iUN3S2ekWNld7qS1rZ19xxu4vWAEVksUMVERvHO4luoGDx+U1jE9ZxCHTjTqgkjTYowMPWPnB1vX8IXDm/VlG7Mn8asb/4vSQZ1rRxsTT23xFlZsLOaq4YmAYOkMpae9Vj/b6fKyt7Ke7SUOhIDffnkCyfEWXr7ruqCdO0J5FzuM8+jaZqj4HeMU3Zgg21VBOeP7nlZ5DEV306lg2lJf9lrrbpr2ha7WSynf6OmJw2xv/QfgT6qB2okisFC3W4ti7PYB3+mpJ+1cg8QC0VIDAt3BnbdR7BPBis2HSmLsSrVWgvV8uj3CeCMcrG7sNJVQxqh00rhq2EBK7S5OnVE0naKTZ5XrVwXOFycOp1A17ra2tbNsTi7Xpifx+FtFTBxlo8Lh5pSqJVXUuVj59QI+/3slZzomEt0wnBCr5Nan2+KoqvcwIDaSs81txLe4uXf33/nmh/8g1qfYuD5JzeCJ2XezIyM/5Ods/K4W5g/jYHUDSMmKjcV6vWurJUrXGCaOsulTV2NeWbDP1RgJrsUdadMXTdtcvbNCt/F05W0KZTfsju4Ezbm60bt7IAb7DfUl3U3Tblb/D0bJUdukvp8F7AR6LIwgrPbWzcCiEPv+Evjl+Zw/XLrTUDoC6aJC2o80d+vB6gbdjd5d1Kv2Y3G4vDy34ageGKiNxWqJ4sm3j3CwukG3cWgxJ9NzUpg5ejDPbypmUkYyWr6Xx9vGqm3lpNsUm1BMpOCWa4czNDGWhfnDea+oFre3jR2lDmzWaHaX1zMlK4XVH1RQancxNDGW5fPHUmpvYm1hNRmD4nlo7X4qnW6S46N11z1AU3M7w5NiaWuXTBiZxMhEC7F/WsND2/9MqqsBgNr4ZP77hq/x96vn0B4ROt0xMElVE+BaR41gmq3yeSk6WfcpGTLgf8d6R1OLavDvsPGEk192rm7v7oTHhU7VSI636L+hYE0QLjbdTdPuAhBC/AfIk1KeVN8PhfMqd3tJ0b2G0kbgD77zNj72Vjbo8TiBSYxz89L41p/3ApJffWEcNqtFjxpetVXp625VEzk1G9fDC/J0W9dDa/czbkSiHnOSlZrAf63eQ4PbR3FtE9UNHpbNySXOomgrs8aksqPUQandRU29h9ioSH7+z0O66/9gdYM+xnpXK7mDE2htkzx6y1XYrBbu+6viu9A8VZMzkxmTNoCjtWcYkzaQZl8be8qdeLxt1J5tIWv/B3x360vknFK8eJ4oC6uu+yIvTP4CbotmLA/NpIxknttwDE0DDZyCQGfNNlR0dbCb3jgFDNzO6fKSkhDTSYgFft+BYQ8XKsVDozdSNfoy/SMQIWX3sYtCiE+klJ8yvI8ADhuXXQoUFBTIwsLCc97POM1amD/snKKag63XDIXGXmF7K526IJmWncINo1N58u0jakCcwONtI84SwcL84bodQ9MItAjjZXNy0fKvjBnlw5NiqWlo1tMutDHWu736vhoZKVbe+PY06t1ePchues4gtpfUsXz+WD/bhtYoEWDCyCT2HW8AYHpOCsOS4lhbWM3sNjtfe+P3zC7r+Nw3FtzETyd9hVMDB4X9HWhjAPRx9AbnE1HcUerVx4qNJb06zv6KEGKvlLKgJ/uGG/S4UQjxLvCK+v4O4L2enPBSxKjOGjUG7ampCSqQrNhYgtvr61ThTzuO0T71wpZSffq2dEYWlQ43VfUehifFsa24jsVTRgGKUVZ76h6sbuThBXmMG3ECt9fHuv0nKLW7/KoTrt5ZTvbgBDytPk40NFPT0Ey6LY6F+cN1LeyhtftJHRBDqd3FsMRYTmg2IIdbvR7l9YSRSbS2tbF4yih9urgwXwnpqql3U+FQYotOn2nRr3N7iYPh3gae2PwXvnTgXaKk4s7fO+oaHrnxGxwakkPagBgGeH2cbQnP1KfF2QTTQC9kSsL5TIWCGbBNwifcoMfvCiE+D2gdQVZJKf/Re8PqW4LFHmk/LMX+gl/3CE2gTM8ZxLI5OXhaNc9Vmy5IAr00q3eW42ltZ/GUkZTVubnjunTuvVGJ0n338Cn2HW/g45oGg1tcMD1HqUbY2nZYjyBeOiNT15CMT2VQDNKnVCFRVe9h9Y5yquo9OJpaOFhzhoGxytcvBEzOtNHaJtl3vIF6VytbixWBaz/bQlW9hxMNzXq8jsfbTpwlgkMnlEqKQwbGUt3gISZKENfm40sf/IPvfvAqCV5l++Mpw3l85l1syJmsnAyoPdshvMLhjutGhtRIz1WAhNPH7XwESV8mm14o+qKuUdjdQYB9wFkp5XtCCKsQYoCU8mxvDawv0X7cf919nEqnW/ewaFMUo+fLaA/SYksUBx9oZTGCFdjSBMasMalsL6nj1T1Veo7YpiNKsbxGj49ZY1LRss2n56QwLTvFL/Xg7UOnmDVmMD9542N2lztZPGUU07JT8LVLdpc7GZ4US6OnlaaWNv6xv4azzW0MiFUMxUMGxuD1tVOjak/Tc1JYNieXD0qV1IN0WxypA2Koqvfo/wEOVDewu9ypjyFCAFJy08Et/HjraoY3ngagITaBFdO+zNqCz9EWZYEQAY/REdAaIhZSIzBvrru6QV3RlfC6EIKkLwuUXSj6oq5RuE0cv4mSUpEMZKOkXqwE5vTe0C4OgX3LNY3IGASpeVGcLq9f1jloRtIxnY5jVNMdTV62FduZm5dGdmqHADvZ0MwHZQ4WXz+KIr3+ThG/+sI4HnnzEFmpCdis0bobe/NRO0tnZFF08gz17lYihKLxrNnVEQFdam/Sgxytlki/8hZnm5UpUXRkBANjBbHRkTSrAiIjxcr2EgczclPJH2ljT0U97VLRlBTjdAK1ZxShNSYtgagIodukZjqKufP15xlTqaQVtkZE8peCm3luyh00xqk1+XztJMRE4vG2ERj32J0ggs6xWMEi3MONpO8No21vJY/2FX1h2A5XM/oOSiLqbgApZfGFKCHSHzD+cADVG+Jj3IgkcgcnEGeJ0m0xxgz094r8Y4I0F73xaa29Lj59lu0lDh558zATRyWhxBtlsmjlTqrqPewoqWPV4gK/Mhx/vnuKbijW7ERTshS3e727lbhoJenTGEw4YWQiVw1L5KrhiXi8beSmDSB38ACaW30crW3C4/VxsOaM7n6Ps0SpKSCCH31mrF9ZisM1jbqwkVL65Z3Z4mN4bFomz7/4Hxa9/num7dukr3t79FSeuvFO8m+cwNVNrfoxtARUAEskeFVTUVwUGAK0Q6IZ7TWNNJRwCieSvjemUV1FO1+KmlJfTDXDFUYtUkqv1sRRTc04rxIi/YVgTwCtcFagN0TTaIL1gw8sRwodpUu1lIJ0W5w+PfN425iWMwhfm+Q3t43368qp/XgnZSQzKlkJuEu3VVBW5yJrkJVlc3Kpd3lZs6uSVDULHhRtbNW2MmzWaOrdisBRyrdaWLPruJ50aYkU2KwWXQA9+fYRPqxw+pVW1fp1ptvi9PQRgHHDB9Le0MChrz3Grze+qrcBOjAkh1/Ovps96UpuFVVn+P5No6mu95CSYNE9bdAhiCA8QQT+RcuMkdHG6TJc+Ej6cOkq2rk/aEqXgkAM17X/a6ABWAzch9IzrUhK+dNeHd0FJtC1H2qKprnbu3LjB+6v5U1NzrSpBbsG6wW7tJymn7xxUM8s16KSp2WnUJCR7Kd9acJQiyoGGBgXyRmPchdnp8bzs8/l8fhbRXoX1ezBCRyqaaTkdJOugUwYmYTVEsWD80bzzuFTFFY4KbU36UbxCSMTqXZ6cLe2MT1nEE0tPj53zVAeW1+Ep7Xdz3UPENXm41vHNnLXhtUdbYAGDuKpG5bwZt5MpIhgyMAYoiIiqG7w6EIx3RaH19euG62t0UKvZ52ibtPdTG16TgqP3nI12akJusYY2FYo1HfT1zdffxiL9pn1NNwg3Gu4GK79HwF3Ax8D96BETb/YkxP2J4xPLEeTl1XbynRP1tIZmfrTVysJqu2j2SWMnistUTU6MpIVG0v0lAxQnurbiu26IALF1pORYtVLdhgLwWtpHErJDkWAnfG0kRgXRbwlilK7i2/9ZS+e1nZdmO2tdOrax4DYSHIHDyA6MoLtJXWcbPQwZGCsvj4xLoqsQfHsO96oj+edw4rRfEepAykhMkLoY0JKPl1eyA82/oEctS2WKzqWl2fcwe/ybyY2MYHRA2I5WtvEDbmpVDrdVDd4uDY9iS3H7LrhW0OzYwcKu67YXuLQp8bBAh67+m772m7TH7xr52sDuhifZ7fCSK3IeFhKORb4v14ZxUXEKOGNdodH3jwEKK5sUPK1tpfU6WUVlAjnJFZsLNbtEpMzk5mcmYyjqYU7rhuJp7WNA1UNLJ4yitjoCMaNSGJh/jCmZNXiaPKyvcTB5Mxkxo9IIs4SoadmTM9JYVJGMs9uOMrSGVl+aR/jR9h0Idbo8ZGdmkC924untZ3s1Hi9rs7SGVlUOT1UOt2cbW5j3/EGhgyMITFOEV6JcdF6Bn2jx4clKoJxwwfyycmztBqKA2mKclu7pOjkWT51uoyfb/4D11cobYBkRAQbpy7gtzd8nYNtcXrtoJE2JbL7rY9P4PK2k26Lo/h0UydjNSjVGJPjo3lo3mgefHU/rWFM+JfNyelUAUHL/QpmtO5PkcX9gfMViBfj8+xWGEkp24QQR41lZy9ljCH7modq3IgT5A1VSlU8OG+MPq1at/8EHq+PoYln2XzUTu7gBGaNSeW+2bkAuuazu9xJSkIMxbVn2V3upK6pRY2IzvGLtF42J9dvOrYwf7henrQjElr4TdWWzclh8ZRRbD56Gps1WtdukqxR/Oa28WQMitdLVNx7Y7aemwboMUbptji/6Ggp0Q3L6bY4bNZooiIjyBmcQMnpJmrPNOOtPsGPd/yZz+/foLcBcs+cxVtLvs8Pjkpow1BgHipVDcflVdSeqnoPi6eMZG1hte6xAxicYMEaE0WFw83/21jsJ4iCZfZrBEtC7spo3d3Nd751rK40LoZ2F+40zQYcFkLsAfTcASnlwl4ZVS+iaUMer4/NR+1My05hV1kdu8vrWTYnhwmjbCRao3lifRG5gwewals507JTWDoji0J1KpRuszJuRCK5aQNocHnZU+FkUkay6tkpYsn1Gaz+oEIv27G2sIpSu4vl88eSHG/R5+9aTtsjbx6m1O4iOzWevKEDePLtIyydkcn0nEHUu7xsLa6jqt5DZERHp9UGt48tx+y6B0wrm5E3LBG3tw1fWzt1TV5ONDbrMUITRiYycZRS7vTVPcd5tbBKP26Fw01iXDRFpad4vORdFrzzJ+K8SlR23Ygstt37Yz4ZPxVEBEvTlIqCC/OH8+qe4/ynqFbdv6N20XUZNpZMy6TR4+Wtj2vxqdrXrdeO4N4bs1m9s4KKuiYq6ly69mS1ROjCLJDARFk4v/IvvVXHyqTnhCuMftaro7iIBGZ7axoIoBdj12xFbq+P7NR4dpQ6sERF6NrF2r1VNLe2s3z+WIpOnKHC4ebZDcf4892Tefmu6/TAyHEjknQjtLH8qFEgaqECs8ak8vCCPNbtP8GyOTmcbGhme0kd21WTlGa0fmTdYSqdSlExj9fHio3FemF2t9enJ9WCkuO2qCAdT6sybbOqVQcBik93GLJvyE3lywUxfP7QJqJf+hm2BuXmbLAO5L+nf43jX/gyW8sbYXsFAIunjOInn1XSEuMsUWr+WgoPzhvDsxuOkjc0URU45bx54BQAkQLGpyfxmauHdOrGquHythMbFUGzr51B8Uo1R43AWk9wfuVf+tr7ZtKZ7uoZxQL3Ajkoxus/SCnDdMb2P3ztErfXp0+XOopwKUmqcdEROF1ecgcPoLWtnbyhiazaVqYLinRbhS6IslPjWVSQjqOphe0ldeQNVYL7nC4vDpeXadkpLMwfxpKpGazeWcHeSqdeftStamW5gwewbE4O9a5WSu1NvPphFau2lrF8/lg9wjk2KoLF12foqSKVTrc+np+8cRDoKACfkWJl3PCBHKw5Q7otjh2lDm4YreSsxUVHUu/2IiVU1DWx+aidIQNjWTh+KN+NqGHgQz+Cjz4CoDUqmg9vXczQpx4lvbqZu9Qp68s7yzjjaeMf+6spq2viwXljKKxQxjlxlI0PKzqSfVfvrNCFOyiF8/cdb2DZ3z7SDdpafSOAZGs0uWkDGDIwhjcPnGRkipU6V4eBPTCuK1xCeYHOt46VyYWnO81oNdAKbAPmA3nAst4eVG9R7/Lq2dTaD1OrX6wlu67eWcGqbWW6N6v49Fnum53Le0W12OItuiBatbiA5HgL996Y41de4rXCKl07efXDKoprz5KbNkAv1u5wefXxxFkieWDeaO56eY9e3D47NZ5JGUo5Ds1jFmeJ8CsPqgVUaoZtKaXumdLqFKUOsDD/6qE4mrx6YTWtVnVstGJsjq0o5YvrfsnA3R2VFjflz+LnU75GdWIay8qamDl6MEvXFPKb28Yzc3Qqd6/5EKerle0lDg6f+JB6dytJ1ihmjh5MxqB4fdqzvcTBhJGJpNviiIuO4NhpZXZfVe/Rp3Nnm9t0O5HT3Urx6bMMGRgD4Ofp0665J/Qnr1p/oz+EHBjpMs5ICPGxlPIa9XUUsEdKOSHkDv2clIxPyYd+/3fuvTGn04f/3IajrNhYwtIZmcRZIjFm4WtTraUzMik+3RS0WaGGsfLjB6UO9lTUc12GjfiYKN02Yez3Xu/28oPXDmA/20LqgBj2HW8gOzWeBeOG6ufWvHiaEMxOTdCTbbWcOG1sA2OjePOAUtDeGKeklSIprHBy6FAF3//gFb60t6MNUNHIT/HXLz3An8UwPT4oI8VKa5uSuzYq2cqWH87C6fLy6LpDvPXxSb9Us8mZyVgtkSy5PoMXt5fR2tauC0vteEabUkyUQErFsyZQ8tvapH+ktpGKpz7X6XMOjBHrSVmXK5nzjT0KRm/GGemTdrVMbE/O0W9oavFRfLpJn54Zy8VqcUJxliislkiefPuInoW/MH+47p439s8K/KFr77XC7xmD4tlTUU/+SBv3zszuVHrW6fKvJzT/mqE4XV5K7S48re0svSGLwzWNXJueRHJ8NKV2l19PrSVTM1kyFb+b8pbfbQdgWGIs6clWJmfaGJ9uY2H+cDYdqOLp4xtJ/r+nsHqUOtit6SN5cuadvDRsEsNtcWRERvDQvNE88q/DVDjcpA1QNJVPDR3AV/9vF9mpCWwptuuCaMLIJKIiBCcaPFTVezhQ3YDTpQQ65g0dQE2DRxds12UkU+l08cnJs34CR4JuxE6Ojw4qjLqqogj0WuLr5SzM+lv4Q3fCaLwQ4oz6WgBx6nslT1vKgT05qRAiGXgVyAAqgNullPUB2+QD/wsMRGlh/Usp5avquj8CMwFNl79TSrm/u/MOiInSO0MYy8VqAsLjbWNvpZMH543RtYoZuYPITk0ge2aCWmlQ+yg65yNp6SBa+dUkaxRLb8jiXrWao7E1jra/VuT+htGpxEVHclNeGqu2lRMXHcHBaiU/7NSZZpyuVrJT4/16aq0trGLV4gL9ZnthS6luj4mMEPq0bPzwJNY98ju+8MoKRjQoBmWvNR7f8p/yl8m3sGD0ULa8fkAXim98VIPT1UpyfDQzx6SytrCaT06epdLp1o3ONms0N48bxvfmjdbHo113XHSEX6Bjcnw0FQ63HuA4PCkWKaVey0jrLAJwqlEJRzDakwI/6+5aP11ILudpXn8IxjTSXdnZ0EWJz48fAxullE8JIX6svv9RwDZuYLGalDsM2CuEeFdK2aCu/4GU8vVzOemIZKti+ynwb7wHkuR4i57QGh1Z7Ne2RkOLEQKpN+WDDhuO1nuq1O4iLjqCBrePohNnQhbjD9xfib7O1Yvo17u9eH2HyE5NYMG4oXowpKOpBZu1Q1PScto6ypkoXTFs1mhGlBZx83d/xDWVShug9ogINk2/hcL/+h4fey3s2FjOrOomVi0uYN3+GsXoLNG7giTFWfTKjUMSYxgyMI4D1Q08e3s+E0bZ9H7xy+bksjB/GI+8eYjtJQ4GxkbxmauHUFPvYUepgwkjk7CfbaFdSmoamv3KnNxRMJLTZ5v5T1Etzb524mMi/ARR4GcFnW+k3rqp+pv2cDlzLvWMLiS3ADeqr1cD7xMgjKSUxwyvTwghTgOpKDlyPaLe5fV7yhkN106Xl/tm53Lc6ea+2bkhOzxoUzit+L52E2i1sD1eHwvGRelTtdzBCXrKSGDRc+MNpbn7F+YP0+1RyfEWvfysUtfIv3JAdmo8983O9RufNn385cp3ueEPv+KWT7bo59t/9fXs/s5PeLJCwCdKKSqt88WUrFoemDdGtyNorX862l/D0huyeH1vFU5XKz94/QCv3TtVr820fP5YbFaLHsF9ptnHkZNncLi8fCotXs+Jm5yZzOi0Adw3O5en3/kEgKO1Zzhae1ZtQS3wBSn+aPysLubUqb9pD5czfSWM0rTi/sApoHMQiQEhxHWABSg1LP6lEOLnwEbgx1LKoKUDje2tR6SP5OH5Y5mUkcxdL+/h4QV5ft0RAErtLj6scDJhlNJdVdNYNh2pJToykgfnjdY1l8AoXpCs2lbO8vljmTDKpvfo0gzioZ6uTpeXn//zEDtKHYwbUeNXp3pRQUdLZG2ZVjnAWI4WVO3g7FniHn2cp3+7gqhWxXNXNSyL1YuW8WJsNsuyc5geVa+74G/ITeWmvEi2FduZlJGst682lhCZnpNC3rBE/nP4lD4NK7W7WL2zQtcWNe1uR6lD9+wdrFFm+Fp3zeT4aH71hWv0ZFdNyO0ur2fciETa2116KdyuuJynTlcyvSaMhBDvAUOCrPLL9FebMoZ06amdSP4ELJFSav6b5ShCzILSuvpHwGPB9g9sb33PzGzuenmP3qVDS4BdVJBORZ1Ld61rKNO5Or26YnSk0KdFz204xoqNxfp64xRLQ2s++FphFfVuLyvfL6XoZKOegQ7oN7F6xZ1utsBOp0bbkz6NuHYYvPAC/OxnxNnVkrHWJP51+7d5InUy7RGRZKfGszB/OEumZuotlo/WnuFUYwuVTjdFJxW3vdY5RBNCcdER1Lu8eujArDGpan0jNU3E62PlllKQSjukmaNTeXDtfr8k2OgIyB08gEZ3Ky9sKWVM2gDduxYbpdjHjN6/rjCnTpcnvSaMpJRzQ60TQtQKIYZKKU+qwuZ0iO0GAm8BP5VS7jIcW9OqWoQQLwPfD2dM9rMtOF1evb7Qwwvy/NTw+1/5iFK7S4+mBtRmgElsL6kjI8Ua0BpZuRmVYvFJQEcmebDKf8bUg0fePMSf756i2lzaWDojkwZPK2/ur+EXN1/Fsjk5nRo0GjEe/57mErh+IRQplRbbY2P5x6w7ePPTX+e/Pn0N128r0+0z6/bXYLVE8ditV/PIm4d1IWuzKsbngbFRpCbEsPSGLOKiI9BK3tqs0QCMSonne/PGMNxm1a+to3IB+nSywuH2y12LjY5kd7lTj1PKTo3X3fzNvnbdOF9TX8ix064uS9GaU6fLk4g+Oq/Wthr1/5uBGwghLMA/gDWBhmpVgCGUWINbgUPhnPTUmWZeK6zSC5kFxgppUdStbYoQ0FgyVSl6/8a3p/ntoy2/98YcPdXiobX7dUHx5NtHdIGxfP5Y7pudqwclaom5mlfv8IkzbFBzvB5/q0g/ntI7Dd12pY3rtcIqXlvzLmdvmA2f+YwuiPjqV/nrmg08NG4RW0828/hbRewodRAdKfRYoyffPqLWbFKEqZY2AoqtZ+3eaopONLJiYwkebxvZqfHUuxUB8ugtV+lVLVfvrKCm3s3kzGQWTxnF5Ewbm4/a8Xh9LJ8/llWLC5icqWiZmYPiSbfF4XS1Mj0nRUnyTbECMCrZqsdPeVUfv1EQ9ZYX5UIQ+L2Y9Jy+shk9BawVQnwDqARuBxBCFAD3SinvVpfdAKQIIe5U99Nc+H8RQiiV6mE/SspKtwwZGNulan/vjTkUn27S7TPGDHBjGdnAOCUgqG1HW649yZ/bcFSvY3THdR25UWsN07S46Ai+NyeXEruLpTMy9fZAHm87q7aVsfWYnR9NSCbnpw/x7gf/JrJduWtPXT2BIX9cBRMn8lmXF3tSR0Bkui2O7SUOslITiI2KYHJmMrvKHOwuryc7NZ7HblWqMxZWOPXibHlDE5k4ysauMqXRY5I1ip99Lk/3RvqHRijTV2OslvbZ/e/XJuohD5Mzk6mq99CqCpwRtjhuyE0l1hLJuv2KrewXN1/FN9d8SGt7Rxb/1cMHhPP19gmm/erC0SfCSErpIEgxfyllIUoRN6SUfwb+HGL/2T05b+qAmC69L8nxlk4u/cDGfKD86Iw348HqRp65Pb+Tbafzj1O5WSscbtbtVwIntb5nkzNtREdGsr2kjjc+qtFvXi1HbXpOCjE+L9eu+T053/0749Q2QLWDhrH728uZ/oNvQkKMPl5jQOSmI7VU1XvYctROpbPDjqNNoxTjO3oi8KwxqdxxXTpPrC/SjcwNbh/3v7qPM5423F4fS6ZmsunIaXaXOxkyMEY3iGv924zTyGduz2f1zgp2lSnb7C536jYlrVccwK4yJ1ERQteKNEPixzX9twmNab+6cPSVZtRnnKtbOFj8D3S48j8orWPzUTurd5bzwLwxXT4dl0zNUGOA6tAEk8er2E3Gj0ji3htzlARTtSHArjLFnpORHMcTZ/cz4KVHSKlXzGtNsfH8v+vvYPXEm/n29DxO7q32s09pAZFaMi8IxqQlAIKjtWcZPyKRqdmDeGTdYWoaPNyaP5zpOSm69qTFC03PUaoN7DveoJe93XzUztZjdk6rheiiI5XZfkaKVS8Dq4UIgCK8rZZIPZn3htxUCisVITsgpuMnqAnedFscjqYW3KpUio3qv5H/pv3qwnHFCSOjMTlY/eSuIn0Ds761Pu57KurRhEswjCEAml1qYf4wQJnSaP+146/aVs6yObn86DOf4uWn1rD8tRcYVqbE5LRFRhF57z3Y7/8hn2w5wV3DEwGpCyCluL+i8SxdU8icsWlqNclBrNl1nFljUtld7mT22MGs/qCCSqebNR9UsvWYnQqH2y+nbFSylbxhidwxKZ07X9qjazAHqzuSWLNT4/nNbeP1et/adWqBkFoIhNvr01tUR0bU6Ybtsy0+Fk8ZxaETDWgTs33HG/XqAwBu32XR+8GkG644YWS07azeWaFXSTSWK3V7fV16skrtTXpbIa2nmSZcgmleq3dWsGJjsT6tgY6SGEumZuhjUFBuvIEnKhn4yLd5/oONHeedfCNb7lnOrbffyH9UO5MlKoIl12fosT/Pbypm1eIC/uvlDym1uxiUoAiWvKEDmJE7yK9+j1Zj+0RDs+6G1yo2ptviqHS6WbW1jJR4C/OvHsKqbeVMGJnI1cOS+LC8jhNnWvjenFy2HDtN7uABPP3OJ+wur2fjJ7XsqahXDeYYbEY2MlKslNpdWCIFMVFK2khZnUvP0tcM/FGRHb6V/mzANrlwXHHCyGgXcjS1sGJjMW6vT4/dUaKsOwIhAw3XgB6g6PZ+rDdKHDdCcZkbi7XNzUvjifVFpCYoyabalCwxLkqPZQoUdnd+Kom5K9dy9bOvIFqVPOWK4Tl8uOxnVOdPYcXGYlrV8WhC9UB1A57WdpLjo/WKArdeO4wVG0sYkzYQqyWKO64bqXsCNQP0ooJ0Zo9N48m3jxAbJWj2Sb1UbeoAC6kDYoiOjGBuXho2q8WvVMqilXU0enz8bN0hGtz+ia0nG5vVV0JPk8lIseoaV1SEwNsm8ba1MWtMKrmDE/QQg6p6D+m2OI47OgIfrxrWfw3YJheOK04YAQbvln/iq4ZiZ/Gy6chpNh2p1W8iTWhcNTxR9X5JNh+1Mz0nRc8H0zp7LCpI1wMLtae9NiVr9Ph45j9HuWF0akcN5vFDaF+xgtjfPM01LmV60j5kCFsXf4+PZt/Cis2lLEMJKnR7fdS7vYwbkajnkCXHR/Pi4kl6eRHocOWv2VXJlKwOL5ijqYVV28p1Q/Sfd1VSVe/RE1ajIoRfPaHlfz/Iyq8X6Okx9/11n1rkP0oXRFpi67DEWLXEbRL1rha2FZ9hwsgkAF378rVLkuKiWTheSbStd3spOnmGlHgLm4+d7tRN5PDJ8zNgX86Z95cTV6Qw0ug8Repg45Fa3a6hGFS9+rTt3pnZpMRbDC2LFG1IaZIomJuXpsQzDU5gR6mD67NTyDnbwn2zc3nn0EkOVDfia2/nybePsO3YaRL+vY47dv+F5JNKTFGLJZaYH36fhvsf4miRg4V5aRARgTaFM7ZCWjYnl+jICDYftbPl2Gm2HLPrJV2VKpJeMlKsTMpI1u1hWnzP3soGlkxFr5E9KtlKVb3Hr0IjKDYxLdTBGC0+dshAfdp5tlnRcho9rZxobKbU3uTXuBFgyMAYBg+IITJCMCkzhTsmKVqnw6V0Tkm3xelGciPWmPMLhzPd75cGV7QwChXZ/NDa/Xrmvae1nap6D6u2lZGS0DneKHumooko5WQVobT+oOKuXzoji1ljUomNUoSF19fO81+ZoN8cd0XbufO5nzHqE6Xcq4yI4IPJNzFs5Qoyxo3mNYNHSkvQXTYnh6UzsthVVsfwpFjqXS1+ra+1KaISCa1oRQDPb1IqEWhTu4wUK9tL6li9s4KCjGT2HW/AFh/DsdNKSZPkeIvafCCO+VcP8asZvfWYnezUBGKjIxg/IgmA5tY2jpw6o3efbfT49HSP6EhobVO6lWjTwI+qGtUUmVa9021rW/CQa2+oUOwwMd3vlwZXtDAKRmApkOk5g8gaFE9ZXROTMpJ1Y6zb2+Zn/NamMFr7o1ljUolT7UnTcwYBSnug1TvLaa+o5MV3n2XOgc0INc29KHs8Hz34M+YvuRlA7wfmaGph05HTjBmi1MteMjWTh9bu1z1Na3Ydp6zOzcRRSSzMH46ntY3DNY162ooS2yP11Bcl5qecXWVOddokuWNSOsW1Z/Xut9pNu3pnuVL2NrpDM3mvqJYdpQ7K61ycaGxm8ZSRPHbrNdz18h7Vq6gwOTOZUclKsGWjx6sLGq0Y256Kej2q+7Fbr9abIATDdw6yKNiUzHS/XxqYwigA7UaclJHM85uKeXiBEnW8Zlcl0ZHFejDim/trqHC4O3Wb1bQUY6+0maOVfK38gTD9xf/m6jf+RJxP0RAcQ9P5yeSv8+7o6+G4oElN/1BaGfnYeOQ0pXYXu8udLJ4yiuR4C/fNzqW4tomBcVGc8fjULiJ1WC1RpMRb2FHq0AMZd5c7WT5/rF9ZEqslit3lTj0Se1eZk93lTsaNSNKrF2jbrdioaGZ7KxuYOCqJmaMHMyrZqgdPvnngBLGWKNJtSlXJMWkDiY2OpLDSwdq9Wr4+upaptdt+6u1PEELwo8+MZd3+E+QOTiDdZuUf+6s71TIK1ggyFOaU7NLlihdGgU9SLfVD04AOVO/k2UX5eoH+KVm1bCtWYnIGxip1rVe+X0JKQoxf1cdv/Xkvu8udLJ2RxZZPTjFq7Wq+Vfga8fWK16jROoDfTr6doi8u5oOqswxPiuVz1wzzqx6gdA1xEQG0A//YX82SaRk8v6mY6gYP2dHxVDco6SU35Q3RBeDSG7JwNLXQ7GvXu9Uaax5pgZB/+7BKL/E6a0yq2rCgEkeTl3tvzPYrJ6IJvF1lTl0QxUZF0OjpaI+kGe4fWrtfN4DHx0SQbI3hh58ewzMbjrG9pA6vr013/W85ZtenltOyUzjb3EZMVAQDY6Kwq/leUedgMjKnZJcuV7wwChYEqU3VYqMETlcr31v7EZsemqXbiCZlJHOy8QDxligO1jTyn6Ja/nDnJMDYuUMx7Iq33+KLb/wPI08qBdFkdDTinnto/+FPGVzmorXezQdVZ6lpaCYlQRGGms2qrV3xnm0+epqD1Y2cbW7Ta2Zr00jtf0qChfeKav0aCGjsrdyFp7WdXWUOXdMrMtShHhATSe7gBA6owYyFlU4WrazVG08+/5UJeqfaKlUQJcZFseKOa1n26kc0enzERAm/aeywxFhcXqWVtqvFwxsf1ejeNO3/ycZmhibGAkr0dnaqYvBv8bVj93UknrafwzTNnJJdulzxwkhLVDUmx2pG2np3K0Unz9Dg9vklzn5Y4VQN1Jk0elqpcLh5dc9xEIJv/HEPQgiWJTcx+4/PMP6TD/Vzbci5jo13PcQPl92qaCjJXu5/RTFeT89RAhJf2FLKfbNzKa9z6Tad5+7I55E3D+sahdY37b2iWn06qcUCadc0boRSQvZvH1ZyxtNGbHSEXsNJ63RSXtdETUMzZ1vaWLWtnLyhA8hIseJra9eTYydlJLN6ZwV5QxP9orMbPT4ef6uIT181hLWF1bT4JM9vUqaxxmmcVhMJqXgltxbX6cLo3cOneOPb03TPYNrAM+QNSaC0zk2LwVAU0Ve1JUwuKle8MHqvSNEAZo1J1VX7dftrdPf1uBGJnPG0diq45vb68LS2k5JgodLp1qc8aWcdPLjtT9x2eDORahugY8Ny2fxfD/HKwNFUONxkGtzk20vqdOGiGXGXzcllhM2q3rSC7NQE/nz35E5TSluBRddEpmTV+pXB1YI4G9xe1hZW8+m8IeQNG9ipg+qqbeVERkBbOxSp8Tzjhieq+/p4Vp1aAXpIwJCBMXha2yi1uxiaGMfi60dRerqJ+2bnMiUrBUeTl1XbyhgYG6VUpZSwaluZXgFyyMAYTp1podHjY93+GsaNSMLra/frMKtl7ANkhWgLZXJ5cUUJI624Wqii+KB4sYxxNs4mL9UNHt01rgkDo3EXwHfmDMv2/INvFr5JQovy5G8bNpzVNy3h8dTJTBs1mAo18dToJjdOnTQvnMerGKWnZaewZGqGnn5y3+xc3N42Vu8s16tHap6/uXlpelmTepeXsromHr3lapLilGtNGxire/w0tCDMtnYlKtrXrgQ8Nrd2RFQrheNseuySsWCazRrN9pI6quuVzh83VDj1c2hxWortSPjtd1PeEI7WnqG1TbKtuI59xxtYekMWVw1LZFeZg6OnztBisFpPyex4EJhcvlxRwujUmWbu++s+CjKSWZg/jPeKav16uHdk6OfoSZ2zPzWYKrVIvxZRva3YzqO3XI3b20azu5n4V//CF996meFnFDtNU3QshxbdxehnHqfxYwf3I/F4lUjpiaNsujBct79GjT86pNcUmpuXxiNvKrXijjvdrHy/lAPVDewudxqmbqDVwNY6nGgVHI01hp5YX8S4EYnqO8kLW0r1WCS3mpoyYWQS+4438IVrh/OvgyfwtLZTq2bjpyXEcKC6kR99ZiwABRlK/7VX91Tx7uFT+lSswuFmWnYKc/PSeG7DUUDwm9vG662soyMFpXYX6bY4hibGEmuJ1Kd7GnHREVhVG5z2XnsoxFpC/0x7M7rajNy+uFxRwmhATBQ7Sh3sKHXo8UDGUrBGLWnJVAxNHvN45M1D+jRie4mD9w6d5AFxHJ5YDoWFgNIGqPWOL/HmLfcwf8EUvebRsjm5xFkiWDYn19DuCDxe5WbTXPH3zMzmhS2lepshLdhSa6Q4MDaKCSMT2Xe8kQ9K61gyNYOJo5LVWkJCL2uiaUYPL8jDZrXoOXOaoF0+f6wulJbNyWVG7iBA8L9fncjjbxXxs8/lsfqDCjYftVPb1KKXitVCBOIskVQ6lXrYNms0B2vOkJ2a4BcrtLeynvlXDyXOEsHC/OH6uqp6D9dnp5Bui6Oq3sOQgTGMTLZS727F09rO4ikjdbvSgJhIzra00eD2hhQMvenKN8MELi5XlDAakWxliZqvtTB/mB4PlDv4ONuK65ibl+bXDkerPaRUTFQE0YT0RDJPVXDjT+6FXZv0Y+8YOY7j3/8pX77vdr6Kktm/9ZidxVNG6VOc5fPH+j9h1ZS4dFsckzKSeW7DMTxq6Y16V4ta9B5dUzlYc0YPoNRSNBTh1jGl0TqGfG/eaP1c2tTJaolU3f8n9PMYO4zMGpPKa/dOJTneQnqKlUaP4tXTivQHVhaoqvcwSrUjldqb9CL+gB4KsGxODtmpCXqBNY/a2WTW2MGs+aCSUSnx7C536gGTkzOTO9XP3l3mDCkYetOVb4YJXFyuKGEUFSH8Omtkz1QMo8Wnm9heUufXEFEzLgNkDbKSNyyLmkMl3PX2/3DNO68T06Zk1NePzKblkV9wOOM6bpucoR/7ifVFejdYpZJjMtuK7fq08In1RXoCbVW9R/dEASybk0OsJUoJIhwykNgopTC+ZtXNSo3Xe5IBndotdfU0X7e/Rq9YqQlHraGlsUjce0W1eqzQ9JxBfrWftGaSIJg5OpXoyGKWXJ+BJSpC18buf+UjvyJyyjgj8bQqGtnSG7JYrraNevqdIxSdaORsSxten5Ljdt/sXP625zgbPqnl0YVXMS49CegsGHrTlW+GCVxc+kQYhdPeWt2uDfhYfXtcSrlQXZ4J/A1IAfYCX5dSnlNFdGPBs9SEGGzWaJZcn6Gvn5uXxit7jivBjV4Po/68mnv//WeSPWrBr0Qbhbd/k28OuI4Hs/M7NXzUOpBoKRaabeeJ9UrhfC0/bOmMTOIsUSzMH8a4ESdQtA6hBxLOHpumH1u7wTXX+Z6KelJUYaKNed3+EyydkelXjwn8K1Yum5MLSL/urMbpHig3/dZjdnaUOvTOJ4HNIrVlmhA1evV+++Vr/cr3ajWd9AoG0REsKkjn/lc+0mOyslPjmZSZwqqtZYwbkYS9qYV6dytHa89y49jBpmC4zOkrzSic9tYAHillfpDlTwPPSSn/JoRYCXwD+N9zGYB2c76wtRSnS9FyVn9QwY1jB+N0eXlifREnaxv48ZmPuf2hl0murgCgOTKaTxbcwcEl3+WaCaOZqsb4GIWF29vGkqkZTMlK4YynlbWFVdw9PZOTjc3cNzuXRGs0x51K8GKcJQqrJRKbtaNyZIfHq0NgGDW1SqebyZk2pmQpsUmabWvd/hOs2FisBz0aO9iGqlipEayCQUFGMgUZNt1z19U0yRgyEGjfcbq8FFYoAqeq3qPWyc70u6Zp2Sk8/5UJAKTEW3B7fbp30ZwmXRn02/bWoVDbE80GvmLY/xecgzDSyqBqcS+JcVFkp8aTO3gATpeXv+8qw7VhE2/uXcvYYx/p+72Tez2bv/odqodmsWN3HdllHkrtLqZkKXlg2o0FUr95k+OVfmRPvXOERo+Pdw6d4ief+5TeGtrt9XW6yY0lbTU04/Susjp2l9czJSuFB+aN5oUtpboHTTNOB8YSaccM1XtNr6lkEFSa8d04lQP8PGZGY7zN2nH8wPrXWtmR6zJsWKIiuW92rm4/0vqzLZmaGcTGFWV6sq4g+nt761ghRCHgA56SUv4TZWrWIKXUgmGqgeGhTmRsbz1y5EhAu9FKWDojk/+ovcqslihe3FJMtr2Sxf/+I9/4+2tEaHkIkyZx5qePcHxALkPaJK9uLNENrMYnt9vbhuJ9y9TPPyZtAI+/VURMVASNnrMcqFZmox29x5R611r0tVETCrwRrZZIfvWFcbrggA4hpZ1X214rbWKcWhnRSqVoxfWVypUdFS8DjbeaMFOEX0fTRs0rCQTVwoz/NQ9edKTQ91k+f2zQ6Vew9lAmlzf9vb31KClljRAiC9gkhPgYaAyxbVAC21uDIiCS46OZmq24tP9vawnjhIvvV65j/P/8DeFSS55mZMBPfgJf+xoD4+JYCuyrrGf9wZP87HN5fFTVgOZZUtpYZ+hNF42ayI1jB/Ortz6h6ORZxo+w6WPThOLy+WN5r6hWz5EbNyLRry2SUXBoy6BDs1kyNSPozdqVa1oLmJw1JpXctAFq2ILw71QbREho0eeaNX3zUTvTspUOIqX2Jl1QGvc1lljRPHqafayrKZjpWr+y6NftraWUNer/MiHE+8C1wN+BJCFElKodjQBqgu0fisffKsLpauXx9Yf5YlY8dxau41t/WMcAhzqMxETc936btdd/noVzx5Mc13GjP7vhGKV2Fy9uL2dG7iDVixWlT0dC3Tz33pitF2fTCNQctJincSOS/NoiGQWHcf/ubtauXNOB61IMmkhXxzQar7WplKbxBNOSAvftSFcZ3Wl9IFqEujEw9VLEDJ4MEynlRf8DfgP8WH39Y+DXQbaxATHq60FAMZCnvn8N+JL6eiXw7XDOO3HiRCmllHsrnPJzT7wlS/7nZdl81dVSgvIXHS3lnXdKeeyYXLnpmBz1o/Vy5fsl0sgv1x+Wo360Xv5y/WHpaGqRK98vkY6mFiml1N+XnD7rtzxcAo/X0+XnQ0+O2dV1n88YV75fEvQ7uNS4XK4jHIBC2VO50NMdz+cPxe6zURUw7wHJ6vIC4EX19VQUt/4B9f83DPtnAXuAElUwxYRz3okTJ0rpckm5bZuU8+d3CCGQxwumS7l9u5Rer5Ty/ATAhf7x9YbQuVjnOp/P4mJed29yuVxHOFxywqiv/iZedZWU3/iGogGpQqg17yr5n0d+Kx2n63v6+XeiP93Q3RE41ktZkJr0PecjjISy/5VBQVSULGxTS5oOGQLf/z7cdRck9++s8N60OWhueM2rZdo3TM4HIcReKWVBj/a9ooSRELLQaoV77oH774f0dIi8svuVmsLH5EJiCqMwKUhOloXvvQdXXw0W88YzMbnQnI8wuqISZcnIgAkT+noUJiYmQbiyqgubxZRNTPot5t1pYmLSLzCFkYmJSb/AFEYmJib9AlMYmZiY9AtMYWRiYtIvMIWRiYlJv8AURiYmJv0CUxiZmJj0C0xhZGJi0i8whZGJiUm/wBRGJiYm/QJTGJmYmPQLTGFkYmLSL+gTYSSESBZCbBBCFKv/bUG2mSWE2G/4axZC3Kqu+6MQotywLv9iX4OJicmFpa80I629dS5KYf4fB24gpdwspcyXSnvr2YAb+I9hkx9o66WU+y/CmE1MTHqRvhJGt6C0pUb9f2s3298GvC2ldPfmoExMTPqOvhJG4ba31vgS8ErAsl8KIQ4KIZ4TQsRc8BGamJhcVPp7e2vUjrPXAO8aFi9HEWIWlNbVPwIeC7H/UmApwMiRI8/hCkxMTC4m/bq9tcrtwD+klK2GY2taVYsQ4mXg+12MYxWKwKKgoODK6T5gYnKJ0VfTtHXAEvX1EuDNLrb9MgFTNFWAIYQQKPamQxd+iCYmJheTvhJGTwHzhBDFwFz1PUKIAiHEi9pGQogMIB3YErD/X4QQH6O0vR4EPHExBm1iYtJ79EmrIimlA5gTZHkhcLfhfQUwPMh2s3tzfCYmJhcfMwLbxMSkX2AKIxMTk36BKYxMTEz6BaYwMjEx6ReYwsjExKRfYAojExOTfoEpjExMTPoFpjAyMTHpF5jCyMTEpF9gCiMTE5N+gSmMTExM+gWmMDIxMekXmMLIxMSkX2AKIxMTk36BKYxMTEz6BaYwMjEx6ReYwsjExKRfYAojExOTfoEpjExMTPoFfSKMhBCLhBCHhRDtQoiCLrb7jBDiqBCiRAjxY8PyTCHEbnX5q0IIy8UZuYmJSW/RV5rRIeALwNZQGwghIoHfA/OBPODLQog8dfXTwHNSyhygHvhG7w7XxMSkt+kTYSSl/ERKebSbza4DSqSUZVJKL/A34Ba1V9ps4HV1u9UovdNMTEwuYfqkVVGYDAeqDO+rgclACtAgpfQZlndqZ6RhbG+N0oH2cmz4OAio6+tB9BKX67Vdrtc1pqc79powEkK8BwwJsuqnUsquOsheUIztrYUQhVLKkDaqS5XL9brg8r22y/m6erpvrwkjKeXc8zxEDUo3WY0R6jIHkCSEiFK1I225iYnJJUx/du1/COSqnjML8CVgnZRSApuB29TtlgAXTdMyMTHpHfrKtf95IUQ1cD3wlhDiXXX5MCHEvwFUree7wLvAJ8BaKeVh9RA/Ah4UQpSg2JD+EOapV13Ay+hPXK7XBZfvtZnXFYBQFA0TExOTvqU/T9NMTEyuIExhZGJi0i+4rIXR+aad9FeEEMlCiA1CiGL1vy3Edm1CiP3q37qLPc5w6e7zF0LEqGk/JWoaUEYfDLNHhHFtdwoh7Ibv6e6+GOe5IIR4SQhxOlTMnlD4rXrNB4UQE8I6sJTysv0DPoUShPU+UBBim0igFMgCLMABIK+vx97Ndf0a+LH6+sfA0yG2a+rrsYZxLd1+/sC3gZXq6y8Br/b1uC/gtd0J/K6vx3qO13UDMAE4FGL9Z4G3AQFMAXaHc9zLWjOS55F20vujOy9uQUmDgUs/HSacz994va8Dc9S0oP7Opfjb6hYp5VbA2cUmtwBrpMIulLjAod0d97IWRmESLO0kZHpJPyFNSnlSfX0KSAuxXawQolAIsUsIcevFGdo5E87nr28jlZCPRpSQjv5OuL+tL6rTmdeFEOlB1l9q9Oie6s+5aWHRX9JOLjRdXZfxjZRSCiFCxWeMklLWCCGygE1CiI+llKUXeqwm58W/gFeklC1CiHtQNMDZfTymPuGSF0ay99JO+pSurksIUSuEGCqlPKmqv6dDHKNG/V8mhHgfuBbFhtGfCOfz17apFkJEAYkoaUH9nW6vTUppvI4XUeyBlzo9uqfMaVqItJM+HlN3rENJg4EQ6TBCCJsQIkZ9PQiYBhRdtBGGTzifv/F6bwM2SdVS2s/p9toCbCkLUbINLnXWAYtVr9oUoNFgVghNX1vme9nq/3mU+WoLUAu8qy4fBvw7wPp/DEVr+GlfjzuM60oBNgLFwHtAsrq8AHhRfT0V+BjFg/Mx8I2+HncX19Pp8wceAxaqr2OB14ASYA+Q1ddjvoDX9iRwWP2eNgNj+3rMYVzTK8BJoFW9v74B3Avcq64XKIURS9XfXlBPduCfmQ5iYmLSLzCnaSYmJv0CUxiZmJj0C0xhZGJi0i8whZGJiUm/wBRGJiYm/QJTGF0hCCGaAt7fKYT43Tnsn9FfOqsIIX4hhPh+Lxz3RiHEevX1wkuhgsPlxCUfgW3StxgaI1xWSCnX0f+DXy8rTM3oCkcIMUAIUS6EiFbfD9TeCyEmCiEOCCEOAN8x7HOnEGKdEGITsFGtr/RPNdlzlxBinLpdqlpv6bAQ4kUhRKUaDY4Q4mtCiD1qDZ8XhNJBGCFEkxDil+p5dwkhQiUBjxdCfKDWdPqmuq8QQvxGCHFICPGxEOIOdfmNQoj31UTUI0KIv2hZ/2q9oSNCiH0oXY6N1/g79fUf1fo8O4UQZUKI29TlEUKI/1H33yCE+Le2zuTcMYXRlUOc6CjgtR8lChgp5VmUek+fU7f7EvCGlLIVeBm4T0o5PsjxJgC3SSlnAo8CH0kpxwE/Adao2zyCkrpxFUrpj5EAQohPAXcA06SU+UAb8FV1n3hgl3rOrcA3Q1zPOJSE0uuBnwshhqEIk3xgPDAX+I0h3eJa4HsordKzgGlCiFjg/4CbgYkET0zWGApMBxYAT6nLvgBkqMf8ujoWkx5iCqMrB4+UMl/7A35uWPcicJf6+i7gZSFEEpAkldo1AH8KON4GKaVW02a6tl5KuQlIEUIMVJf/TV3+DlCvbj8H5eb/UBWMc1AEBIAXWK++3otyswfjTSmlR0pZh5JGcZ16vleklG1SylpgCzBJ3X6PlLJaStkO7FePOxYol1IWSyUV4c8hzgXwTyllu5SyiI6SLdOB19Tlp9RxmPQQ02ZkgpRyh2qgvhGIlFIeUoVRV7jO45QCWC2lXB5kXavsyFFqI/RvNDCPqbu8phbD666OG87+l0Jht0sOUzMy0VgD/BVlaoaUsgFoEEJMV9d/NcR+ANu09apAq5NSngF2ALery28CtFrdG4HbhBCD1XXJQohR5zjeW4QQsUKIFOBGlAz5bcAdQohIIUQqSnnUPV0c4wiQIYTIVt9/+RzHsAOlMFqEatu68Rz3NzFgCiMTjb+gCItXDMvuAn6vTqW60gZ+AUwUQhxEsado5T4eBW5SQwIWoVSlPKtOdR4G/qPuswHFJnMuHESZFu0CHpdSngD+oS4/AGwCfqhOn4IipWwGlqI0Et1HiLpQXfB3lKz1IpQp3j6UKpQmPcDM2jcBQPUC3SKl/PoFPGYM0Cal9Akhrgf+V7VXXTYIIRKklE2qhrYHxSgfUgCahMa0GZkghHgemI9Se+dCMhJYK4SIQDFMh/KMXcqsV+1rFhQNzRREPcTUjExMTPoFps3IxMSkX2AKIxMTk36BKYxMTEz6BaYwMjEx6ReYwsjExKRf8P8B6b9y7mtLRp0AAAAASUVORK5CYII=\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "0.7939834118649287\n0.38506165\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-11-14T13:07:30.484022\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "experiments = ['AtomNet_feat0_tangent_main','AtomNet_feat1_tangent_main','AtomNet_feat2_tangent_main']\n", "feature_name = ['Electrostatics', 'Hydrogen bonding', 'Hydrophobicity']\n", "for i,experiment in enumerate(experiments):\n", " preds = np.load(f'{experiment}_preds.npy')\n", " labels = np.load(f'{experiment}_labels.npy')\n", " sample = np.random.choice(len(preds),10000,replace=False)\n", " preds_sample = preds[sample]\n", " labels_sample = labels[sample]\n", " prla = np.stack([preds,labels])\n", " corr = np.corrcoef(prla)\n", " rmsd = np.sqrt(mean_squared_error(labels,preds))\n", " print(corr[0,1])\n", " print(rmsd)\n", " fig = sns.regplot(labels_sample,preds_sample,scatter_kws={'s':1,'alpha':1.0},line_kws={\"color\": \"red\"})\n", " plt.xlabel(feature_name[i])\n", " plt.ylabel('Predicted')\n", " plt.xlim([-1,1])\n", " plt.ylim([-1,1])\n", " plt.axes().set_aspect('equal')\n", " plt.show()\n", " fig = fig.get_figure()\n", " #fig.savefig(f'figures/{feature_name[i]}_predicted.pdf')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: data_analysis/analyse_descriptors.py ================================================ import numpy as np from pathlib import Path from sklearn.metrics import roc_auc_score, roc_curve from scipy.spatial.distance import cdist import matplotlib.pyplot as plt top_dir = Path('..') experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_c_restarted_epoch43', 'TangentConv_search_3L_16dim_12A_FIXED_binet_g_restarted_epoch38', 'TangentConv_search_1L_8dim_12A_FIXED_binet_gc_epoch34', 'TangentConv_search_3L_8dim_12A_FIXED_binet_gc_restarted_epoch49', 'TangentConv_search_1L_16dim_12A_FIXED_binet_gc_epoch45'] with open(top_dir/'surface_data/raw/protein_surfaces/testing_ppi.txt') as f: testing_list = f.read().splitlines() pdb_list = testing_list for experiment_name in experiment_names: print(experiment_name) desc_dir = top_dir/f'preds/{experiment_name}' all_roc_aucs = [] all_preds = [] all_labels = [] for i, pdb_id in enumerate(pdb_list): pdb_id1 = pdb_id.split('_')[0]+'_'+pdb_id.split('_')[1] pdb_id2 = pdb_id.split('_')[0]+'_'+pdb_id.split('_')[2] if i%100==0: print(i,np.mean(all_roc_aucs)) try: desc1 = np.load(desc_dir/f'{pdb_id1}_predfeatures.npy')[:,16:16+16] desc2 = np.load(desc_dir/f'{pdb_id2}_predfeatures.npy')[:,16:16+16] xyz1 = np.load(desc_dir/f'{pdb_id1}_predcoords.npy') xyz2 = np.load(desc_dir/f'{pdb_id2}_predcoords.npy') except FileNotFoundError: continue dists = cdist(xyz1,xyz2)<1.0 if dists.sum()<1: continue iface_pos1 = dists.sum(1)>0 iface_pos2 = dists.sum(0)>0 pos_dists1 = dists[iface_pos1,:] pos_dists2 = dists[:,iface_pos2] desc_dists = np.matmul(desc1,desc2.T) #desc_dists = 1/cdist(desc1,desc2) pos_dists = desc_dists[dists].reshape(-1) pos_labels = np.ones_like(pos_dists) neg_dists1 = desc_dists[iface_pos1,:][pos_dists1==0].reshape(-1) neg_dists2 = desc_dists[:,iface_pos2][pos_dists2==0].reshape(-1) #neg_dists = np.concatenate([neg_dists1,neg_dists2],axis=0) neg_dists = neg_dists1 neg_dists = np.random.choice(neg_dists,200,replace=False) neg_labels = np.zeros_like(neg_dists) preds = np.concatenate([pos_dists,neg_dists]) labels = np.concatenate([pos_labels,neg_labels]) roc_auc = roc_auc_score(labels,preds) all_roc_aucs.append(roc_auc) all_preds.extend(list(preds)) all_labels.extend(list(labels)) fpr, tpr, thresholds = roc_curve(all_labels,all_preds) np.save(f'roc_curves/{experiment_name}_fpr.npy',fpr) np.save(f'roc_curves/{experiment_name}_tpr.npy',tpr) np.save(f'roc_curves/{experiment_name}_all_labels.npy',all_labels) np.save(f'roc_curves/{experiment_name}_all_preds.npy',all_preds) ================================================ FILE: data_analysis/analyse_descriptors_para.py ================================================ import numpy as np from pathlib import Path from sklearn.metrics import roc_auc_score, roc_curve from scipy.spatial.distance import cdist import matplotlib.pyplot as plt import dask top_dir = Path('..') experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_c_restarted_epoch43', 'TangentConv_search_3L_16dim_12A_FIXED_binet_g_restarted_epoch38', 'TangentConv_search_1L_8dim_12A_FIXED_binet_gc_epoch34', 'TangentConv_search_3L_8dim_12A_FIXED_binet_gc_restarted_epoch49', 'TangentConv_search_1L_16dim_12A_FIXED_binet_gc_epoch45'] experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_gc_restarted_epoch47'] experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_gc_subsamp50_epoch25'] experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_gc_subsamp50_restarted_restarted_restarted_epoch53'] ndims = [16,16,8,8,16] ndims = [16] with open(top_dir/'surface_data/raw/protein_surfaces/testing_ppi.txt') as f: testing_list = f.read().splitlines() pdb_list = testing_list @dask.delayed def analyse_pdb(pdb_id,D): pdb_id1 = pdb_id.split('_')[0]+'_'+pdb_id.split('_')[1] pdb_id2 = pdb_id.split('_')[0]+'_'+pdb_id.split('_')[2] try: desc1 = np.load(desc_dir/f'{pdb_id1}_predfeatures.npy')[:,16:16+D] desc2 = np.load(desc_dir/f'{pdb_id2}_predfeatures.npy')[:,16:16+D] xyz1 = np.load(desc_dir/f'{pdb_id1}_predcoords.npy') xyz2 = np.load(desc_dir/f'{pdb_id2}_predcoords.npy') except FileNotFoundError: return -1 dists = cdist(xyz1,xyz2)<1.0 if dists.sum()<1: return -1 iface_pos1 = dists.sum(1)>0 iface_pos2 = dists.sum(0)>0 pos_dists1 = dists[iface_pos1,:] pos_dists2 = dists[:,iface_pos2] desc_dists = np.matmul(desc1,desc2.T) #desc_dists = 1/cdist(desc1,desc2) pos_dists = desc_dists[dists].reshape(-1) pos_labels = np.ones_like(pos_dists) neg_dists1 = desc_dists[iface_pos1,:][pos_dists1==0].reshape(-1) neg_dists2 = desc_dists[:,iface_pos2][pos_dists2==0].reshape(-1) #neg_dists = np.concatenate([neg_dists1,neg_dists2],axis=0) neg_dists = neg_dists1 neg_dists = np.random.choice(neg_dists,400,replace=False) neg_labels = np.zeros_like(neg_dists) preds = np.concatenate([pos_dists,neg_dists]) labels = np.concatenate([pos_labels,neg_labels]) roc_auc = roc_auc_score(labels,preds) return roc_auc, preds, labels for experiment_name, D in zip(experiment_names,ndims): print(experiment_name) desc_dir = top_dir/f'preds/{experiment_name}' all_roc_aucs = [] all_preds = [] all_labels = [] all_res = [] for i, pdb_id in enumerate(pdb_list): res = analyse_pdb(pdb_id,D) all_res.append(res) all_res = dask.compute(*all_res) for res in all_res: if res==-1: continue all_roc_aucs.append(res[0]) all_preds.extend(list(res[1])) all_labels.extend(list(res[2])) print('ROC-AUC',np.mean(all_roc_aucs)) fpr, tpr, thresholds = roc_curve(all_labels,all_preds) np.save(f'roc_curves/{experiment_name}_fpr.npy',fpr) np.save(f'roc_curves/{experiment_name}_tpr.npy',tpr) np.save(f'roc_curves/{experiment_name}_all_labels.npy',all_labels) np.save(f'roc_curves/{experiment_name}_all_preds.npy',all_preds) ================================================ FILE: data_analysis/analyse_output.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3.6.9 64-bit ('venv')", "metadata": { "interpreter": { "hash": "e286eeaba7b180e725693b6a215723848210ad7ec5921e757e3b22ff5228ac6c" } } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from pathlib import Path\n", "import matplotlib.pyplot as plt\n", "import plotly.graph_objects as go\n", "from tqdm import tqdm\n", "from scipy.spatial.distance import cdist\n", "from sklearn.metrics import roc_curve, roc_auc_score\n", "import seaborn as sns\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "experiment_name = 'TangentConv_site_3layer_9A_epoch46'\n", "datafolder = Path(f'preds/{experiment_name}')\n", "masif_preds = Path('masif_preds/')\n", "timings = Path('timings/')\n", "raw_data = Path('surface_data/raw/protein_surfaces/01-benchmark_surfaces_npy')\n", "pdb_list = [p.stem[:-5] for p in datafolder.glob('*pred.vtk')]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 348/348 [03:36<00:00, 1.61it/s]\n" ] } ], "source": [ "n_meshpoints = []\n", "n_predpoints = []\n", "meshpoints_mindists = []\n", "predpoints_mindists = []\n", "for pdb_id in tqdm(pdb_list):\n", " predpoints = np.load(datafolder/(pdb_id+'_predcoords.npy'))\n", " meshpoints = np.load(datafolder/(pdb_id+'_meshpoints.npy'))\n", " n_meshpoints.append(meshpoints.shape[0])\n", " n_predpoints.append(predpoints.shape[0])\n", "\n", " pdists = cdist(meshpoints,predpoints)\n", " meshpoints_mindists.append(pdists.min(1))\n", " predpoints_mindists.append(pdists.min(0))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "11548.850574712644 1853.1779711119525\n6320.732758620689 1028.4567617386515\n" ] } ], "source": [ "print(np.mean(n_predpoints),np.std(n_predpoints))\n", "print(np.mean(n_meshpoints),np.std(n_meshpoints))" ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [], "source": [ "all_meshpoints_mindists = np.concatenate(meshpoints_mindists)\n", "all_predpoints_mindists = np.concatenate(predpoints_mindists)" ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEGCAYAAACtqQjWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZwdVZ338c83nQabtROITBLAAA8TBwaSQMsWdJBRgqgkIiAOakRGdEAH1MmYKPOwyOsRJuPGqCgKAoIsYggBwYCAODISSEggBIxEFkmDEIGwtpjl9/xR5ybVTfft6s5d+nZ/36/Xfd2qU9uvutL9S9U5dY4iAjMzs0oYVu8AzMxs8HBSMTOzinFSMTOzinFSMTOzinFSMTOzihle7wBqbfvtt49x48bVOwwzs4ayaNGiP0fEqN7WG3JJZdy4cSxcuLDeYZiZNRRJTxRZz4+/zMysYpxUzMysYpxUzMysYpxUzMysYpxUzMysYoZc6y8zs6Fk7uJ2Zs9fzlOrOxjT2sKMKeOZNmls1Y7npGJmNkjNXdzOrDlL6VizDoD21R3MmrMUoGqJxY+/zMwGqdnzl29IKCUda9Yxe/7yqh3TScXMbJB6anVHn8orodekIukYSVun6dMlzZG0T9UiMjOzihjT2tKn8koocqfyHxHxsqSDgXcBFwEXVC0iMzOriBlTxtPS3NSprKW5iRlTxlftmEWSSumB3HuBCyPi58BmvW0kaSdJd0h6SNIySaem8jMltUtakj5H5LaZJWmFpOWSpuTKD09lKyTNzJXvImlBKr9aUq9xmZkNFdMmjeWrR+3F2NYWBIxtbeGrR+1V1dZf6m2Mekk3Au3Au4F9gA7gnoiY0Mt2o4HREXFfeny2CJgGHAu8EhH/1WX9PYArgf2AMcAvgb9Ni3+fjr8SuBf4cEQ8JOkaYE5EXCXpe8D9EVH2LqqtrS3coaSZWd9IWhQRbb2tV+RO5VhgPjAlIlYDI4EZvW0UEU9HxH1p+mXgYaBcepwKXBURr0fEY8AKsgSzH7AiIh6NiL8CVwFTJQk4FLg2bX8pWdIyM7M6KZJUvh8RcyLiEciSBfDRvhxE0jhgErAgFX1G0gOSLpY0IpWNBZ7MbbYylfVUvh2wOiLWdinv7vgnSVooaeGqVav6ErqZmfVBkaSyZ35GUhOwb9EDSNoK+BlwWkS8RFbJvxswEXga+FrhaPspIi6MiLaIaBs1qtcxZszMrJ96TCqp0vxlYG9JL6XPy8CzwPVFdi6pmSyhXBERcwAi4pmIWBcR64EfkD3egqzeZqfc5jumsp7KnwNaJQ3vUm5mZnXSY1KJiK9GxNbA7IjYJn22jojtImJWbztOdR4XAQ9HxNdz5aNzq30AeDBNzwOOk7S5pF2A3YF7yCrmd08tvTYDjgPmRdbC4A7g6LT9dAomOzMzq45e+/6KiFmSxgJvya8fEb/uZdPJZHUvSyUtSWVfAj4saSIQwOPAp9L+lqXWXA8Ba4FTImIdgKTPkDUWaAIujohlaX9fBK6SdA6wmCyJmZlZnRRpUnwu2d3BQ2x8ZyUi4sgqx1YVblJsZtZ3RZsUF+ml+APA+Ih4fdPDMjOzwaxI669HgeZqB2JmZo2vyJ3Ka8ASSbcBG+5WIuJfqxaVmZk1pCJJZV76mJmZlVWk9deltQjEzMwaX49JRdI1EXGspKVkzX87iYi9qxqZmdkgVOsx42ut3J3Kqen7fbUIxMxssKvHmPG1Vu6N+qfT9xPAX4C90qcjlZmZWR/UY8z4WisynPCxZN2lHEPWDf4CSUeX38rMzLqqx5jxtVak9deXgbdFxLMAkkaRDaB1bdmtzMyskzGtLbR3k0CqOWZ8rRV5+XFYKaEkzxXczszMcuoxZnytFblT+YWk+WRD/QJ8CLipeiGZmQ1Opcr4wdz6q9cOJQEkHQUcnGb/JyKuq2pUVeQOJc3M+q6SHUoC/C9ZD8XrycY3MTMze4Mirb/+maz11wfIBsS6W9Inqh2YmZk1niJ3KjOASRHxHICk7cjuXC6uZmBmZtZ4irTieg54OTf/ciozMzPrpMidygqyFx6vJ+sDbCrwgKTPA+THnzczs6GtSFL5Q/qUXJ++t658OGZm1siKdH1/Vi0CMTOzxuc3483MrGKcVMzMrGJ6TCqSzkvfx9QuHDMza2Tl7lSOkCRgVq2CMTOzxlauov4XwAvAVpJeAkTWpFhARMQ2NYjPzMwaSI9JJSJmADMkXR8RU2sYk5lZVQz28eEHgiJNiqdK2gF4WypaEBGrqhuWmVllDYXx4QeCIh1KHkPn4YTv8XDCZtZohsL48ANBkTfqT8fDCZtZgxsK48MPBB5O2MyGhJ7GgR9M48MPBEWSwy8kzZf0cUkfB36OhxM2swYzFMaHHwiKVNTP6DKc8IWNPJywmQ1NQ2F8+IGg0Bj1g4nHqDcz67uiY9S7bsTMzCrGScXMzCqmbFKR1CTpiloFY2Zmja1sUomIdcBbJG3W1x1L2knSHZIekrRM0qmpfKSkWyU9kr5HpHJJOl/SCkkPSNont6/paf1HJE3Ple8raWna5vzUAaaZmdVJkZcfHwXukjQPeLVUWGBs+rXAFyLiPklbA4sk3Qp8HLgtIs6VNBOYCXwReA+we/rsD1wA7C9pJHAG0EbWoeUiSfMi4oW0zieBBWTNnA8Hbi505mZmVnFF6lT+ANyY1t069ykrIp6OiPvS9MvAw8BYYCpwaVrtUmBamp4KXBaZu4FWSaOBKcCtEfF8SiS3AoenZdtExN2RNWG7LLcvMzOrg8Jj1EvaIiJe689BJI0DJpHdUewQEU+nRX8CdkjTY4Enc5utTGXlyld2U97d8U8CTgLYeeed+3MKZmZWQJEOJQ+U9BDwuzQ/QdJ3ix5A0lbAz4DTIuKl/LJ0h1H1F2Ui4sKIaIuItlGjRlX7cGZmQ1aRx1/fJHsE9RxARNwPvKPIziU1kyWUKyJiTip+Jj26In2X+hVrB3bKbb5jKitXvmM35WZmVieF3lOJiCe7FK3rdsWc1BLrIuDhLpX684BSC67pwPW58o+lVmAHAC+mx2TzgcMkjUgtxQ4D5qdlL0k6IB3rY7l9mZlZHRRp/fWkpIOASHcep5JVuvdmMvBRYKmkJansS8C5wDWSTgSeIBujBbLWW0cAK4DXgBMAIuJ5SV8B7k3rnR0Rz6fpk4FLgBayVl9u+WVmVke99v0laXvgW8C7yO5s5gOnRsRz1Q+v8tz3l5lZ3xXt+6tI668/A8dXJCozMxvUirT+2lXSDZJWSXpW0vWSdq1FcGZm1liKVNT/BLgGGA2MAX4KXFnNoMzMrDEVSSpbRMSPI2Jt+lwOvKnagZmZWePpsU4l9bkFcHPqo+sqshcVP4SHEzYzs26Uq6hfRJZESj3/fiq3LIBZ1QrKzMwaU49JJSJ2qWUgZmbW+HptUiypCXgvMC6/foGu783MbIgp8kb9DcBfgKXA+uqGY2ZmjaxIUtkxIvaueiRmZtbwijQpvlnSYVWPxMzMGl6RO5W7geskDQPWkLUGi4jYpqqRmZlZwymSVL4OHAgsjd56nzQzsyGtyOOvJ4EHnVDMzKw3Re5UHgV+Jelm4PVSoZsUm5lZV0WSymPps1n6mJmZdavIeCpn1SIQMzNrfEXeqL+DrK+vTiLi0KpEZGZmDavI469/y02/CfggsLY64ZiZWSMr8vhrUZeiuyTdU6V4zMysgRV5/DUyNzsM2BfYtmoRmZlZwyry+Cs/rspaspZgJ1YzKDMza0xFHn95XBUzMyukyJ0Kkg7ijeOpXFalmMzMrEEVqVP5MbAbsARYl4oDcFIxM7NOityptAF7uO8vMzPrTZEOJR8E/qbagZiZWeMrcqeyPfBQejcl36HkkVWLyszMGlKRpHJmtYMwM7PBoUiT4jtrEYiZmTW+InUqZmZmhTipmJlZxTipmJlZxfRYpyJpKd2Mo1ISEXtXJSIzM2tY5Srq35e+T0nfP07fx1cvHDMza2Q9JpWIeAJA0rsjYlJu0UxJ9wEzqx2cmZk1liJ1KpI0OTdzUJHtJF0s6VlJD+bKzpTULmlJ+hyRWzZL0gpJyyVNyZUfnspWSJqZK99F0oJUfrWkzYqcsNlAMndxO5PPvZ1dZv6cyefeztzF7fUOyWyTFEkqJwLflfS4pCeA7wKfKLDdJcDh3ZR/IyImps9NAJL2AI4D9kzbfFdSk6Qm4DvAe4A9gA+ndQHOS/v6P8ALeIwXazBzF7cza85S2ld3EED76g5mzVnqxGINrdekEhGLImICMAHYOyWD+wps92vg+YJxTAWuiojXI+IxYAWwX/qsiIhHI+KvwFXAVEkCDgWuTdtfCkwreCyzAWH2/OV0rFnXqaxjzTpmz19ep4jMNl2Rru//b5d5ACLi7H4e8zOSPgYsBL4QES8AY4G7c+usTGUAT3Yp3x/YDlgdEWu7Wb+7czgJOAlg55137mfYZpUzd3E77as7ul32VA/lZo2gyOOvV3OfdWSPosb183gXkI3NMhF4GvhaP/fTJxFxYUS0RUTbqFGjanFIsx6VHnv1ZExrSw2jMausIn1/dfrDL+m/gPn9OVhEPJPbzw+AG9NsO7BTbtUdUxk9lD8HtEoanu5W8uubDWjdPfbKG7edk4o1rv68Ub8F2R/xPpM0Ojf7AbKxWgDmAcdJ2lzSLsDuwD3AvcDuqaXXZmSV+fPSgGF3AEen7acD1/cnJrNa6+3x1l1/eJ6JZ93iCntrSEXqVPJv1jcBo4Be61MkXQkcAmwvaSVwBnCIpIlpf48DnwKIiGWSrgEeAtYCp0TEurSfz5DdGTUBF0fEsnSILwJXSToHWAxcVOB8zWpm7uJ2zrphGS+8tgaA1pZmzjxyT8a0tvRYn1KyumPNhkdk0yb1WF1oNuCot1GCJb0lN7sWeCZXQd5w2traYuHChfUOwwapuYvbmT1/eY9JY5hg8+HD6FizvtD+xra2cNfMQysZolm/SFoUEW29rVekTuUJSROAt6eiXwMPbGJ8ZoNOqQK+XH3J+qBwQgG3BLPGU+TN+FOBK4A3p88Vkj5b7cDMGs1ZNywrm1D6wy3BrNEUGU74RGD/iHgVQNJ5wG+B/65mYGaNYO7ids6ct4zVHWsqvu+W5iZmTBlf8f2aVVORpCKy91NK1qUysyFt7uJ2Zvz0ftasL18v2R8jtmjmjPfv6Up6azhFksqPgAWSrkvz03BLKxvCequM748mifURjGltYcaU8U4m1rCKVNR/XdKvgINT0QkRsbiqUZkNMPlEIsqMXteLYcoq6/Nampv46lF7OZHYoFBu5MeRudnH02fDsogo2lmkWUPr2qprUx52rY/sfZUtNx/OU6s7fGdig065O5VFZL8/pfqT0u9S6T9qu1YxLrO6q1Yl/Isda1hyxmEV3afZQFFu5MddahmI2UBQjfqSrtxM2AazIu+pfEDStrn5Vkkeu8QGndPnLuW0q5dUNaG4mbANdkU6lDwjIl4szUTEarJ+vMwGjeN/8Fsuv/uPVdl3k4TIulxxhbwNdkWaFHeXeIpsZzbgZe+aLKEPPaf0iVt22VBT5E5loaSvS9otfb5OVolv1tDmLm5nxrX3VzyhjG1t8Z2JDVlF7jg+C/wHcDVZq69bgVOqGZRZJZUq359a3UHrFs28vmYdr1Xp1sS9CttQV+Tlx1eBmTWIxaxienpZsTS2STU0DZMr4W3Ic92IDTqVfFmxqM2HD+O8D+7tR1025Dmp2ICXf3xV5A303saAr6Qmia8dO8HJxCwp8p7K5CJlZtVQuutoX91BAO2rO5g1Z2nZ8dtrObDV+ggnFLOcIq2/uhs3xWOpWL/MXdzO5HNvZ5eZP2fyubeXTQ7Q/V1Hx5p1zJ6/vMd91+JxV4nfjjfrrFyHkgcCBwGjJH0+t2gboKnagdng07Wuo3TXAfT4v/2e7jq6ls9d3M7nr1nyhh6Aq8lvx5u9Ubk7lc2ArcgSz9a5z0vA0dUPzQabvtx1lPR0J1Aqn7u4nYln3cJpV1cnoTQp6091bGsLHzlgZ7+DYtaLch1K3gncKemSiHiihjHZIFX0riNvxpTxne5uYOMdQjVHXvzIATtzzrS9Kr5fs8GuSOuvzSVdCIzLrx8RfsPL+mRMa0u3nTWWq5co3QmUWn9t29LMmnXrOe3qJVWL0wnFrP+KJJWfAt8DfkjnserN+qTcXUc50yaNZdqksZw+d2nVOn0sxeJHWmabpkhSWRsRF1Q9Ehv0ut519GXUw7mL26uSUJqHwdr1eARGswopklRukHQycB3weqnQwwlbf5TuOvrqrBuWVSEaePM27qvLrJKKJJXp6XtGrszDCVvNHP+D31atz65avihpNhQU6VDSwwpbzdViWF/wy4tmlVbu5cdDI+J2SUd1tzwi5lQvLBuKeupZuFr88qJZ5ZW7U/kH4Hbg/d0sC8BJxSpm7uL2Ts2Eq5FQWlua2XLz4X1uJGBmxZV7+fGM9H1C7cKxoaZWj7mam8SZR+7pJGJWZb3WqUjaFjgDeEcquhM4OyJerGZgNnjV+jHXiC2aOeP9TihmtVCk9dfFwIPAsWn+o8CPgG7rWszK6dq1SjUSyhbNw/h/R3nALLN6KJJUdouID+bmz5JUvT4ybFA7c96yqvTV5bfhzQaGIkmlQ9LBEfEb2DBAlxv3W2HVqjcZsUUzq19b40p3swGkSFL5F+DSVLci4Hk2vhBpVtbcxe18/uolrK/wfse2+k14s4GoyMuPS4AJkrZJ8y9VPSobNGbNeaDiCcXvl5gNXEXGqN9O0vnAr4A7JH1L0nYFtrtY0rOSHsyVjZR0q6RH0veIVC5J50taIekBSfvktpme1n9E0vRc+b6SlqZtzpfSaEpWd6fPXcpus25i3Myf07GmsinFg2OZDWxFxqi/ClgFfJBsxMdVwNUFtrsEOLxL2UzgtojYHbgtzQO8B9g9fU4CLoAsCZE1Z94f2A84o5SI0jqfzG3X9VhWY3MXt/N3/3Ezl9/9R9ZF5SvjS4+8nFDMBq4iSWV0RHwlIh5Ln3OAHXrbKCJ+TVb/kjcVuDRNXwpMy5VfFpm7gVZJo4EpwK0R8XxEvADcChyelm0TEXdHRACX5fZldbBx/PlKP+zK+JGXWWMoklRukXScpGHpcywwv5/H2yEink7Tf2JjchoLPJlbb2UqK1e+spvybkk6SdJCSQtXrVrVz9CtnO7Gn98UzcPEiC2aPR68WYMp0vrrk8BpwI/TfBPwqqRPARER2/TnwBERkqr9MnXpWBcCFwK0tbXV5JhDTSWbC0sw+5gJTiJmDajXO5WI2DoihkVEc/oMS2Vb9yOhPJMeXZG+n03l7cBOufV2TGXlynfsptzq4Pgf/LayOwycUMwaVJHHX5U0j43vuEwHrs+Vfyy1AjsAeDE9JpsPHCZpRKqgPwyYn5a9JOmA1OrrY7l9WQ3MXdzOpLNvYdzMn3PXHyo7CKjHODFrXEUef/WLpCuBQ4DtJa0ka8V1LnCNpBOBJ9jYn9hNwBHACuA14ATIhiyW9BXg3rTe2blhjE8ma2HWAtycPlYlpbfin1rdQesWzbzYsYYq9LbiCnmzBqeoQtPPgaytrS0WLlxY7zAaysaWXZteET95t5E8/lzHhjFN3vnWUdzxu1Ue48RsgJO0KCLaeluv3MiPI8ttmLtjsEGs6+BZm+IjB+zMOdP2qsi+zGxgKvf4axFZz+QCdgZeSNOtwB8Bj10/CHV9zPXCa2sqst9vfmii70DMhoAeK+ojYpeI2BX4JfD+iNg+IrYD3gfcUqsArXZKj7naV3cQULGEIrk1l9lQUaT11wERcVNpJiJuBg6qXkhWL5V+gbFkiFXbmQ1pRVp/PSXpdODyNH888FT1QrJ6eapK48SPdRNhsyGjyJ3Kh4FRwHXAnDT94WoGZbU1d3E7k8+9fZOH9m1taaa5qXNn0W4ibDa0FBlP5XngVElbRsSrNYjJaqgSzYWbm8Tso7NuVfIV/W4ibDb09JpUJB0E/BDYCthZ0gTgUxFxcrWDs+rb1HqUEVs0c8b799yQOKZNGuskYjaEFalT+QZZF/TzACLifknvqGpUVjP9rUfxOydm1p1C3bRExJNdBlasfBMhq6rSY6n21R00SayLYGxrC9u2NLO6441Nh8emR1ddH40JON4Jxcx6UCSpPJkegYWkZuBU4OHqhmWV1LXepDQqY6m7+mGiUz9epcr10mMs15GYWVFFksqngW+RDYLVTvbio+tTGkhv9SbrI6sbWf3amjckDteRmFlfFEkq4yPi+HyBpMnAXdUJySqtaL3JY+e+t8qRmNlgV+Q9lf8uWGYDVJHxSSrVJYuZDW3leik+kKw7llGSPp9btA3ZkMI2wOUr5wWb/HKjmVlvyj3+2ozs3ZThwNa58peAo6sZlG26rpXzpe6me0osrS3NtQrNzAaxHpNKRNwJ3Cnpkoh4ooYxWQV0VzkfZBXyr/xlLWtyzb2ah4kzj9yzxhGa2WBUpE7lNUmzJd0k6fbSp+qR2SbpqXJ+9WtrmH3MBMa2tiCy91FmHzPBLbzMrCKKtP66AriabByVTwPTgVXVDMo23ZjWlg3voXQtdzNhM6uWIkllu4i4SNKpuUdi91Y7MCuuu04cu3sb3j0Gm1m1FXn8VWpr+rSk90qaBJQdv95qp+toje2rO5g1ZykAXz1qr06Pub561F6+QzGzqipyp3KOpG2BL5C9n7IN8LmqRmWFdVch37FmHbPnL+eumYc6iZhZTZVNKpKagN0j4kbgReCdNYnKCuupQr5aoziamZVT9vFXRKzDozwOaD29LV/kLXozs0orUqdyl6RvS3q7pH1Kn6pHZoXMmDKelubOHRy4Qt7M6qVIncrE9H12riyAQysfjvWVu6c3s4GkyBj1rkcZ4PzeiZkNFL0+/pK0g6SLJN2c5veQdGL1QzMzs0ZTpE7lEmA+MCbN/x44rVoBmZlZ4yqSVLaPiGuA9QARsRaPUW9mZt0oklRelbQdqdd0SQeQvbNiZmbWSZHWX58H5gG7SboLGIXHUzEzs24Uaf11n6R/AMaTjfO0PCI89qyZmb1BkTsVgP2AcWn9fSQREZdVLSozM2tIvSYVST8GdgOWsLGCPgAnFTMz66TInUobsEdE9DS8uZmZGVCs9deDwN9U8qCSHpe0VNISSQtT2UhJt0p6JH2PSOWSdL6kFZIeyPc7Jml6Wv8RSdMrGaOZmfVdkTuV7YGHJN0DvF4qjIgjN/HY74yIP+fmZwK3RcS5kmam+S8C7wF2T5/9gQuA/SWNBM4gu5MKYJGkeRHxwibGZWZm/VQkqZxZ7SCSqcAhafpS4FdkSWUqcFl6/Ha3pFZJo9O6t0bE8wCSbgUOB66sUbxmZtZFr4+/0rj0jwPNafpe4L5NPG4At0haJOmkVLZDRDydpv8E7JCmxwJP5rZdmcp6Kn8DSSdJWihp4apVqzYxdDMz60mRDiU/CVwLfD8VjQXmbuJxD46IfcgebZ0i6R35hemupGINAyLiwohoi4i2UaNGVWq3ZmbWRZGK+lOAycBLABHxCPDmTTloRLSn72eB68jeg3kmPdYifT+bVm8HdsptvmMq66nczMzqpEhSeT0i/lqakTScTbiLkLSlpK1L08BhZC3M5gGlFlzTgevT9DzgY6kV2AHAi+kx2XzgMEkjUkuxw1KZmZnVSZGK+jslfQlokfRu4GTghk045g7AdZJKx/9JRPxC0r3ANWmslieAY9P6NwFHACuA14ATACLieUlfIavjATi7VGlvZmb1od7eaZQ0DDiR7E5AZHcDP2zUlyHb2tpi4cKF9Q7DzKyhSFoUEW29rVekQ8n1wA/Sx8zMrEc91qlImirplNz8AkmPps8xtQnPzMwaSbk7lX8HjsvNbw68DdgS+BHw0yrGNaDMXdzO7PnLeWp1B2NaW5gxZTzTJnX7SoyZ2ZBWLqlsFhH5lwt/ExHPAc+lVltDwtzF7cyas5SONVkHze2rO5g1ZymAE4uZWRflmhSPyM9ExGdys0PmDcLZ85dvSCglHWvWMXv+8jpFZGY2cJVLKgvS2/SdSPoUcE/1QhpYnlrd0adyM7OhrNzjr88BcyX9Exv7+tqXrG5lWrUDGyjGtLbQ3k0CGdPaUodozMwGth7vVCLi2Yg4CPgKWYeSj5O9YHhgRDxTm/Dqb8aU8bQ0N3Uqa2luYsaU8XWKyMxs4CrynsrtwO01iGVAKlXGu/WXmVnvinTTMuRNmzTWScTMrIAiHUqamZkV4qRiZmYV46RiZmYV46RiZmYV46RiZmYV0+t4KoONpFVkg4DlbQ/8uQ7hVJPPqTEMtnMabOcDPqeSt0REr110Dbmk0h1JC4sMPtNIfE6NYbCd02A7H/A59ZUff5mZWcU4qZiZWcU4qWQurHcAVeBzagyD7ZwG2/mAz6lPXKdiZmYV4zsVMzOrGCcVMzOrmEGZVCTtJOkOSQ9JWibp1FQ+UtKtkh5J3yNSuSSdL2mFpAck7ZPb1/S0/iOSptfrnHLxNElaLOnGNL+LpAUp9qslbZbKN0/zK9Lycbl9zErlyyVNqc+ZbIilVdK1kn4n6WFJBzb6dZL0ufTv7kFJV0p6U6NdJ0kXS3pW0oO5sopdF0n7Slqatjlfkup0TrPTv70HJF0nqTW3rNufv6TDU9kKSTNz5d1e41qfU27ZFySFpO3TfG2uU0QMug8wGtgnTW8N/B7YA/hPYGYqnwmcl6aPAG4GBBwALEjlI4FH0/eIND2izuf2eeAnwI1p/hrguDT9PeBf0vTJwPfS9HHA1Wl6D+B+shE8dwH+ADTV8XwuBf45TW8GtDbydQLGAo8BLbnr8/FGu07AO4B9gAdzZRW7LmRDkh+QtrkZeE+dzukwYHiaPi93Tt3+/NPnD8Cu6d/r/cAeuWv9hmtc63NK5TsB88le9N6+ltep5r909fgA1wPvBpYDo1PZaGB5mv4+8OHc+svT8g8D38+Vd1qvDuexI3AbcChwY7rQf879UhwIzE/T84ED0/TwtJ6AWcCs3D43rFeH89mW7A+wupQ37HUiSypPpl/Q4ek6TWnE6wSMo/Mf4Ipcl7Tsd7nyTuvV8py6LPsAcEWa7vbnn792+fXK/S7W45yAaxAGdGQAAAhNSURBVIEJZCP2lpJKTa7ToHz8lZceJ0wCFgA7RMTTadGfgB3SdOkPQcnKVNZTeb18E/h3YH2a3w5YHRFr03w+vg2xp+UvpvUH0jntAqwCfqTskd4PJW1JA1+niGgH/gv4I/A02c99EY19nUoqdV3Gpumu5fX2CbL/jUPfz6nc72JNSZoKtEfE/V0W1eQ6DeqkImkr4GfAaRHxUn5ZZKm3YdpTS3of8GxELKp3LBU0nOzW/YKImAS8SvZYZYMGvE4jgKlkCXMMsCVweF2DqoJGuy69kfRlYC1wRb1j2RSStgC+BPzfesUwaJOKpGayhHJFRMxJxc9IGp2WjwaeTeXtZM8gS3ZMZT2V18Nk4EhJjwNXkT0C+xbQKqk0LHQ+vg2xp+XbAs8xsM5pJbAyIhak+WvJkkwjX6d3AY9FxKqIWAPMIbt2jXydSip1XdrTdNfyupD0ceB9wPEpWULfz+k5er7GtbQb2X9o7k9/K3YE7pP0N9TqOtXimV+tP2TPNy8DvtmlfDadKxr/M02/l84VWPek8pFkz/xHpM9jwMgBcH6HsLGi/qd0rhw8OU2fQucK4GvS9J50roB8lPpW1P8PMD5Nn5muUcNeJ2B/YBmwRYrzUuCzjXideGOdSsWuC2+sAD6iTud0OPAQMKrLet3+/Mnurh9NZaWK+j3TNt1e41qfU5dlj7OxTqUm16nmv3Q1+iEfTHZr/gCwJH2OIHvueRvwCPDL3A9OwHfIWnUsBdpy+/oEsCJ9Tqj3uaWYDmFjUtk1XfgV6R/15qn8TWl+RVq+a277L6dzXU4NWt30ci4TgYXpWs1N/6gb+joBZwG/Ax4Efpz+MDXUdQKuJKsTWkN2R3liJa8L0JZ+Pn8Avk2Xxho1PKcVZPUJpb8T3+vt55/+lvw+Lftyrrzba1zrc+qy/HE2JpWaXCd302JmZhUzaOtUzMys9pxUzMysYpxUzMysYpxUzMysYpxUzMysYpxUrCZSb6mX5+aHS1qljb0t7yDpRkn3K+td+qZUPi5te05u2+0lrZH07TQ/XtKvJC1R1tNxTUbqk3RIKf56kPTx0s+gysd5a/rZLpa02ybu62xJ7+plnUMkHbQpx7H6Gd77KmYV8Srw95JaIqKDrIPP/Nu5ZwO3RsS3ACTtnVv2GNmLW6en+WPIXjAsOR/4RkRcn7bdqzqnMLhIaoqIdQVWnQZcGxHn9LpmLyKiSPchhwCvAP+7qcez2vOditXSTWTJAbIeT6/MLRtNrvO6iHggt+w14GFJbWn+Q2TdjPe07dKuB07/+71T0vWSHpV0rqTjJd2TxovYLa03StLPJN2bPpNT+T+k/62X/se+ddr1Vto4HswV3Y03ke6izkvH+r2kt6fyTnca6U7tkDT9irKxPpZJ+qWk/dJ+HpV0ZG73O6XyRySdkdvXR9Lxlkj6vqSm3H6/Jul+sp5083FOlHS3No4tMkLSEcBpwL9IuqObc3tF0jdSnLdJGtXTvlL5JZKOTtOPSzpL0n3pGrxVWQewnwY+l2J/u6RjlI1Nc7+kX3eNwQYWJxWrpauA4yS9CdibrOfoku8AFykbXO3Lksb0sO1OwDrgqdyybwC3S7pZ2QBZrXRvAtkfrL8DPgr8bUTsB/yQrCsVyPpT+0ZEvA34YFoG8G/AKRExEXg70JHKJ5H90d2D7I3qyT0ce3g61mnAGT2sk7clcHtE7Am8DJxDdnf3AbK7upL9Upx7A8dIapP0d2SJd3KKdx1wfG6/CyJiQkT8pssxLwO+GBF7k71xfUZE3ETW5cg3IuKdPcS5MMV5Z+7c3rCvHs7zzxGxD3AB8G8R8XjueBMj4n/IOkecEhETgCN72I8NEE4qVjPp7mMc2V3KTV2WzSf7o/wD4K3A4tL/epNfkP1RPQ64usu2PyJLFD8le3Ryt6TNuwnh3oh4OiJeJ+t24pZUvjTFBVmHkN+WtASYB2yjrLfru4CvS/pXoDU2dnF+T0SsjIj1ZN18lPbTValT00Vl1sn7azrnUnx3RtZBZT5WyB4ZPpceKc4h66LoH4F9gXvTefwj2c8WsgTzs64Hk7RtOq87U9GlZANA9WY9G6/H5cDBfdxXkZ/LXcAlkj5J1v+WDWBOKlZr88jGG7my64KIeD4ifhIRHwXuJfeHKCL+SvaH5wtkvRl33fapiLg4IqaSdWH+990c+/Xc9Prc/Ho21i8OAw5I/0ueGBFjI+KViDgX+GegBbhL0lu72ec6eq6nfL2bddbS+XfwTbnpNbGxD6UNsabklT9G136WgtSRZe4cxkfEmWn5XwrWo/RXX/t96u7n0nmHEZ8mq0/bCVgkabv+h2fV5qRitXYxcFbXeg9JhyobC4JUX7Eb2UBXeV8je6TyfJdtD1c21AHKuvjejv53O34LGx+FIWli+t4tIpZGxHlkCe+tPWzfF48DEyUNS4/19uvHPt6tbOz4FrIK9bvIOn08WtKbU+wjJb2l3E4i4kXghVJ9D9njwTvLbFIyDDg6Tf8T8JtN2FfJy2TDgJPi3y0iFqRK/lV07qbdBhi3/rKaioiVZK21utqX7LFT6X/vP4yIe1PFbWnbZXRu9VVyGPAtSX9J8zMi4k/9DPFfge9IeoDs9+PXZPUwp0l6J9ldwzKybsAP7HEvxdxF1rLtIeBh4L5+7OMessdZOwKXR8RCAEmnA7dIGkbWg+0pZOOVlzMd+F5K7o8CJxQ4/qvAful4z5LV5fR3XyU3ANcqG8Hws2SV9ruT3YHdRtbdvA1Q7qXYzPpN0isRsVW947CBw4+/zMysYnynYmZmFeM7FTMzqxgnFTMzqxgnFTMzqxgnFTMzqxgnFTMzq5j/D0NM0+ensS8tAAAAAElFTkSuQmCC\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(n_meshpoints,n_predpoints);\n", "plt.xlabel('MSMS mesh number of points');\n", "plt.ylabel('Generated point cloud number of points');\n", "#plt.savefig('figures/pointsperpoint.pdf')" ] }, { "cell_type": "code", "execution_count": 166, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.339973475075206\n1.3164803592192962\n" ] } ], "source": [ "meshpoint_percentile = np.percentile(all_meshpoints_mindists,99)\n", "print(meshpoint_percentile)\n", "predpoint_percentile = np.percentile(all_predpoints_mindists,99)\n", "print(predpoint_percentile)" ] }, { "cell_type": "code", "execution_count": 167, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'Distance to nearest generated point')" ] }, "execution_count": 13, "metadata": {}, "execution_count": 167 }, { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(all_meshpoints_mindists,bins=100,alpha=0.5,density=True,label='Min dist to generated pcd');\n", "plt.xlim([0,meshpoint_percentile]);\n", "plt.xlabel('Distance to nearest generated point')" ] }, { "cell_type": "code", "execution_count": 168, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'Distance to nearest precomputed mesh point')" ] }, "execution_count": 14, "metadata": {}, "execution_count": 168 }, { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(all_predpoints_mindists,bins=400,alpha=0.5,density=True,label='Min dist to precomputed mesh');\n", "plt.xlim([0,predpoint_percentile]);\n", "plt.xlabel('Distance to nearest precomputed mesh point')" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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kTTJQyShbd68ud59jVFdXZ32daZbU+17c6dEL5JGYS1TXFNCuLCwkB49erB06dLoPo0cOZJvfvObXHHFFUlLBh85coSpU6fyjW98g/z8fGbPng3Ayy+/TN++fcnLy+P666+PFjjLyclh2rRpFBQUUFhYyLp167jyyis599xzmTNnDgArV67ksssu49vf/jbnnXceEydO5OjRowBfKqO8aNEiiouLE+57spLJ7733HgMHDoyWZU6ksrKS888/n+LiYnr06MG1117LSy+9xMUXX0z37t0pLS0FSHpMNm3aRFFREQUFBeTn57Nt27bosUpU3rkxlOhF0iisZYohkthKS0t54YUXmDhxYvQB1evWrWPRokX86U9/SloyeO7cuVRWVlJRUcH69eu59tprOXz4MMXFxSxcuJANGzZQXV0drS0DkSq2FRUVXHrppdFfbGvWrInWvAcoLS1l9uzZbN68mR07dvD8888nPd6J9j1ZyeQpU6Zwyy23sGHDBs4666yk69y+fTs/+tGPeOedd3jnnXd45plneP3115k1axYPPPAAQNJjMmfOHKZMmRJ9kEpN+edk5Z0bQ4leJI2aqkzxaaedVmeZ4ueffz5aPjdVicoU19STj/dP//RPtGrViu7du9OtW7fo2e+QIUM444wzgEjJ4Jo6NIMGDYqWDH7ppZe4+eabo0+NOuOMM9i6dSu5ubn06NEj4bZr9jcvL4/+/fvToUMHsrOzadOmDR9//DEARUVFdOvWjaysLMaNG8frr7+e8r7HlkwuKCjg5ptv5oMPPgDgjTfeiP419t3vfjfpOnJzc8nLy6NVq1b07t2bK664AjMjLy8v+kWsZMdk4MCBPPDAAzz44IP8+c9/pl27dtF1xpd3bixdjBVJs7CWKY4v31vzPra0cDpKBteoOT6tWrX60rFq1apV9HpAsphi22v+8ohXV8nkVMoVx8cVG3NNjMmOSc+ePenfvz8vvPACw4cP54knnqBbt24Jyzs3ls7oRdIsjGWKAZ599lmOHj3Kjh072LlzZ8Jknqxk8JAhQ3jiiSeiyW/fvn2cd955VFZWRh/dV9u2kyktLeW9997j6NGjLFy4kEsuuQSAr371q2zZsoWjR4+yePHi6Pyx+15byeSLL744Wo756aefrldM8ZIdk507d9KtWzcmT57MqFGjai2j3Fg6o5dwyuDDxMNY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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(all_meshpoints_mindists,bins=100,alpha=0.5,density=True,label='Min dist to generated pcd');\n", "plt.hist(all_predpoints_mindists,bins=500,alpha=0.5,density=True,label='Min dist to precomputed mesh');\n", "plt.xlim([0,np.max([meshpoint_percentile,predpoint_percentile])]);\n", "plt.xlabel('Distance to nearest point')\n", "plt.legend();\n", "#plt.savefig('figures/nearest_point_dist.pdf')" ] }, { "cell_type": "code", "execution_count": 170, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 348/348 [03:41<00:00, 1.57it/s]\n" ] } ], "source": [ "meshpoints_masks = []\n", "predpoints_masks = []\n", "for pdb_id in tqdm(pdb_list):\n", " predpoints = np.load(datafolder/(pdb_id+'_predcoords.npy'))\n", " meshpoints = np.load(datafolder/(pdb_id+'_meshpoints.npy'))\n", "\n", " pdists = cdist(meshpoints,predpoints)\n", " meshpoints_masks.append(pdists.min(1)]" ] }, "execution_count": 20, "metadata": {}, "execution_count": 174 }, { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(fpr_tangent,tpr_tangent)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.036484644654091826 0.00834115514119933\n" ] } ], "source": [ "conv_times = np.load(timings/f'{experiment_name}_convtime.npy')\n", "print(conv_times.mean(),conv_times.std())" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 348/348 [00:00<00:00, 580.98it/s]\n" ] } ], "source": [ "meshpoints_preds = []\n", "meshpoints_labels = []\n", "for i, pdb_id in enumerate(tqdm(pdb_list)):\n", " mesh_preds = np.load(masif_preds/('pred_'+pdb_id+'.npy'))[0]\n", " mesh_labels = np.load(datafolder/(pdb_id+'_meshfeatures.npy'))\n", " mesh_preds = mesh_preds[meshpoints_masks[i]]\n", " mesh_labels = mesh_labels[meshpoints_masks[i]]\n", "\n", " meshpoints_preds.append(mesh_preds)\n", " meshpoints_labels.append(mesh_labels)" ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8491344631055571" ] }, "execution_count": 113, "metadata": {}, "execution_count": 176 } ], "source": [ "roc_auc_score(np.concatenate(meshpoints_labels),np.concatenate(meshpoints_preds))" ] }, { "cell_type": "code", "execution_count": 177, "metadata": {}, "outputs": [], "source": [ "fpr_masif, tpr_masif, roc_threshold_masif = roc_curve(np.concatenate(meshpoints_labels),np.concatenate(meshpoints_preds))" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(fpr_tangent,tpr_tangent,label='TangentConv')\n", "plt.plot(fpr_masif,tpr_masif,label='MaSIF')\n", "plt.xlabel('False positive rate')\n", "plt.ylabel('True positive rate')\n", "plt.legend(loc='lower right');\n", "#plt.savefig('figures/tang_masif_roc.pdf')" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [], "source": [ "np.save('roc_curves/tangent_site_fpr',fpr_tangent)\n", "np.save('roc_curves/tangent_site_tpr',tpr_tangent)\n", "np.save('roc_curves/masif_site_fpr',fpr_masif)\n", "np.save('roc_curves/masif_site_tpr',tpr_masif)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "fpr_tangent_search = np.load('roc_curves/tangent_search_fpr.npy')\n", "tpr_tangent_search = np.load('roc_curves/tangent_search_tpr.npy')\n", "fpr_masif_search = np.load('roc_curves/masif_search_fpr.npy')\n", "tpr_masif_search = np.load('roc_curves/masif_search_tpr.npy')\n", "fpr_tangent = np.load('roc_curves/tangent_site_fpr.npy')\n", "tpr_tangent = np.load('roc_curves/tangent_site_tpr.npy')\n", "fpr_masif = np.load('roc_curves/masif_site_fpr.npy')\n", "tpr_masif = np.load('roc_curves/masif_site_tpr.npy')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.plot(fpr_tangent,tpr_tangent,label='Ours-site',color='blue')\n", "plt.plot(fpr_tangent_search,tpr_tangent_search,label='Ours-search',color='blue',linestyle='dashed')\n", "plt.plot(fpr_masif,tpr_masif,label='MaSIF-site',color='red')\n", "plt.plot(fpr_masif_search,tpr_masif_search,label='MaSIF-search',color='red',linestyle='dashed')\n", "plt.xlabel('False positive rate')\n", "plt.ylabel('True positive rate')\n", "plt.legend(loc='lower right');\n", "plt.savefig('figures/masif_tangent_comp.pdf')\n" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 348/348 [04:57<00:00, 1.17it/s]\n" ] } ], "source": [ "all_feat_cat = []\n", "for i, pdb_id in enumerate(tqdm(pdb_list)):\n", " predpoints = np.load(datafolder/(pdb_id+'_predcoords.npy'))\n", " meshpoints = np.load(datafolder/(pdb_id+'_meshpoints.npy'))\n", " predpoints = predpoints[predpoints_masks[i]]\n", " meshpoints = meshpoints[meshpoints_masks[i]]\n", "\n", " pdists = cdist(meshpoints,predpoints)\n", " pdist = np.argmin(pdists,axis=0)\n", "\n", " predpoints_features = np.load(datafolder/(pdb_id+'_predfeatures.npy'))\n", " predpoints_features = predpoints_features[predpoints_masks[i]]\n", "\n", " meshpoints_features = np.load(raw_data/(pdb_id+'_features.npy'))\n", " meshpoints_features = meshpoints_features[meshpoints_masks[i]]\n", "\n", " features_cat = np.concatenate([predpoints_features,meshpoints_features[pdist]],axis=1)\n", " all_feat_cat.append(features_cat)" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [], "source": [ "features_cat_np = np.concatenate(all_feat_cat,axis=0)" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [], "source": [ "corrmat = np.corrcoef(features_cat_np.T)" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(6611, 3)" ] }, "metadata": {}, "execution_count": 152 } ], "source": [ "meshpoints_features.shape" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 153 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "sns.heatmap(np.abs(corrmat[10:16,-3:]),annot=True,xticklabels=['PB electrostatics','HBond','Hydrophobicity'],yticklabels=[f'ChemFeat {i}' for i in range(1,7)])\n", "#plt.savefig('figures/chem_covariance.pdf')" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 155 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "sns.heatmap(np.abs(corrmat[:16+8,-3:]),annot=True,xticklabels=['PB electrostatics','HBond','Hydrophobicity'],yticklabels=[f'ConvFeat {i}' for i in range(1,9)])\n", "#plt.savefig('figures/conv_covariance.pdf')" ] }, { "cell_type": "code", "execution_count": 156, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(3978810, 29)" ] }, "metadata": {}, "execution_count": 156 } ], "source": [ "features_cat_np.shape" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(-5.0, 5.0)" ] }, "metadata": {}, "execution_count": 160 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "features_sample = np.random.choice(len(features_cat_np),10000,replace=False)\n", "features_sample = features_cat_np[features_sample]\n", "plt.scatter(features_sample[:,-3],features_sample[:,13])\n", "plt.xlim([-5,5])" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([1.000e+00, 0.000e+00, 2.000e+00, 0.000e+00, 7.000e+00, 4.700e+01,\n", " 6.884e+03, 3.005e+03, 4.900e+01, 5.000e+00]),\n", " array([-20.2865 , -17.367167 , -14.447831 , -11.528496 ,\n", " -8.60916 , -5.6898255 , -2.7704904 , 0.14884463,\n", " 3.0681796 , 5.987515 , 8.90685 ], dtype=float32),\n", " )" ] }, "metadata": {}, "execution_count": 159 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.hist(features_sample[:,-3])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "TangentConv 3 layers", "type": "scatter", "x": [ 231 ], "y": [ 0.865 ] }, { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "DGCNN 3 layers", "type": "scatter", "x": [ 211 ], "y": [ 0.686 ] }, { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "MaSIF 3 layers", "type": "scatter", "x": [ 1050 ], "y": [ 0.849 ] }, { "error_x": { "array": [ 51 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "PointNet++ 1layer", "type": "scatter", "x": [ 162 ], "y": [ 0.804 ] }, { "error_x": { "array": [ 71 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "TangentConv 1 layer", "type": "scatter", "x": [ 173 ], "y": [ 0.835 ] } ], "layout": { "legend": { "title": { "text": "Models" } }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "xaxis": { "title": { "text": "Execution time [ms]" } }, "yaxis": { "title": { "text": "Site identification ROC-AUC" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "performance = [0.865,0.686,0.849,0.804,0.835]\n", "times = [231,211,1050,162,173]\n", "time_errors = [0,0,0,51,71]\n", "labels = ['TangentConv 3 layers', 'DGCNN 3 layers','MaSIF 3 layers', 'PointNet++ 1layer','TangentConv 1 layer']\n", "fig = go.Figure()\n", "for i in range(len(times)):\n", " fig.add_trace(go.Scatter(\n", " x=[times[i]],\n", " y=[performance[i]],\n", " mode='markers',\n", " name=labels[i],\n", " error_x=dict(\n", " type='data',\n", " symmetric=True,\n", " array=[time_errors[i]])))\n", "\n", "\n", "fig.update_layout(\n", " xaxis_title='Execution time [ms]',\n", " yaxis_title='Site identification ROC-AUC',\n", " legend_title=\"Models\",\n", ")\n", "fig.show()\n", "fig.write_image('figures/site_time_perf.pdf')\n", "\n" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "TangentConv 3 layers", "type": "scatter", "x": [ 231 ], "y": [ 0.865 ] }, { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "DGCNN 3 layers", "type": "scatter", "x": [ 211 ], "y": [ 0.686 ] }, { "error_x": { "array": [ 0 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "MaSIF 3 layers", "type": "scatter", "x": [ 1050 ], "y": [ 0.849 ] }, { "error_x": { "array": [ 51 ], "symmetric": true, "type": "data" }, "mode": "markers", "name": "PointNet++ 1layer", "type": "scatter", "x": [ 162 ], "y": [ 0.804 ] } ], "layout": { "legend": { "title": { "text": "Models" } }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "xaxis": { "title": { "text": "Execution time [ms]" } }, "yaxis": { "title": { "text": "Site identification ROC-AUC" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = go.Figure()\n", "for i in range(len(times)):\n", " fig.add_trace(go.Scatter(\n", " x=[times[i]],\n", " y=[performance[i]],\n", " mode='markers',\n", " name=labels[i],\n", " error_x=dict(\n", " type='data',\n", " symmetric=True,\n", " array=[time_errors[i]])))\n", "\n", "\n", "fig.update_layout(\n", " xaxis_title='Execution time [ms]',\n", " yaxis_title='Site identification ROC-AUC',\n", " legend_title=\"Models\",\n", ")\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(time_errors[i])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: data_analysis/analyse_site_outputs.py ================================================ import numpy as np import pandas as pd from pathlib import Path from tqdm import tqdm from scipy.spatial.distance import cdist from sklearn.metrics import roc_curve, roc_auc_score masif_preds = Path("masif_preds/") timings = Path("timings/") raw_data = Path("surface_data/raw/protein_surfaces/01-benchmark_surfaces_npy") experiment_names = [ "TangentConv_site_1layer_5A_epoch49", "TangentConv_site_1layer_9A_epoch49", "TangentConv_site_1layer_15A_epoch49", "TangentConv_site_3layer_15A_epoch17", "TangentConv_site_3layer_5A_epoch49", "TangentConv_site_3layer_9A_epoch46", "PointNet_site_3layer_9A_epoch37", "PointNet_site_3layer_5A_epoch46", "DGCNN_site_1layer_k100_epoch32", "PointNet_site_1layer_5A_epoch30", "PointNet_site_1layer_9A_epoch30", "DGCNN_site_1layer_k40_epoch46", "DGCNN_site_3layer_k40_epoch33", ] experiment_names = [ 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_dist05_epoch42', 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_dist20_epoch49', 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_dist105_epoch44', 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_var01_epoch43', 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_var02_epoch49', 'Rebuttal_TangentConv_site_1L_8dim_9A_gc_subsamp20_var005_epoch37' ] for experiment_name in experiment_names: print(experiment_name) datafolder = Path(f"preds/{experiment_name}") pdb_list = [p.stem[:-5] for p in datafolder.glob("*pred.vtk")] n_meshpoints = [] n_predpoints = [] meshpoints_mindists = [] predpoints_mindists = [] for pdb_id in tqdm(pdb_list): predpoints = np.load(datafolder / (pdb_id + "_predcoords.npy")) meshpoints = np.load(datafolder / (pdb_id + "_meshpoints.npy")) n_meshpoints.append(meshpoints.shape[0]) n_predpoints.append(predpoints.shape[0]) pdists = cdist(meshpoints, predpoints) meshpoints_mindists.append(pdists.min(1)) predpoints_mindists.append(pdists.min(0)) all_meshpoints_mindists = np.concatenate(meshpoints_mindists) all_predpoints_mindists = np.concatenate(predpoints_mindists) meshpoint_percentile = np.percentile(all_meshpoints_mindists, 99) predpoint_percentile = np.percentile(all_predpoints_mindists, 99) meshpoints_masks = [] predpoints_masks = [] for pdb_id in tqdm(pdb_list): predpoints = np.load(datafolder / (pdb_id + "_predcoords.npy")) meshpoints = np.load(datafolder / (pdb_id + "_meshpoints.npy")) pdists = cdist(meshpoints, predpoints) meshpoints_masks.append(pdists.min(1) < meshpoint_percentile) predpoints_masks.append(pdists.min(0) < predpoint_percentile) predpoints_preds = [] predpoints_labels = [] npoints = [] for i, pdb_id in enumerate(tqdm(pdb_list)): predpoints_features = np.load(datafolder / (pdb_id + "_predfeatures.npy")) predpoints_features = predpoints_features[predpoints_masks[i]] predpoints_preds.append(predpoints_features[:, -2]) predpoints_labels.append(predpoints_features[:, -1]) npoints.append(predpoints_features.shape[0]) predpoints_labels = np.concatenate(predpoints_labels) predpoints_preds = np.concatenate(predpoints_preds) rocauc = roc_auc_score(predpoints_labels.reshape(-1), predpoints_preds.reshape(-1)) print("ROC-AUC", rocauc) np.save(timings / f"{experiment_name}_predpoints_preds", predpoints_preds) np.save(timings / f"{experiment_name}_predpoints_labels", predpoints_labels) np.save(timings / f"{experiment_name}_npoints", npoints) ================================================ FILE: data_analysis/analyse_site_outputs_graph.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from pathlib import Path\n", "import matplotlib.pyplot as plt\n", "import plotly.graph_objects as go\n", "from tqdm import tqdm\n", "from scipy.spatial.distance import cdist\n", "from sklearn.metrics import roc_curve, roc_auc_score" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "timings = Path('timings/')\n", "raw_data = Path('surface_data/raw/protein_surfaces/01-benchmark_surfaces_npy')\n", "\n", "experiment_names = ['TangentConv_site_1layer_5A_epoch49', 'TangentConv_site_1layer_9A_epoch49', 'TangentConv_site_1layer_15A_epoch49','TangentConv_site_3layer_5A_epoch49','TangentConv_site_3layer_9A_epoch46', 'TangentConv_site_3layer_15A_epoch17','PointNet_site_1layer_5A_epoch30','PointNet_site_1layer_9A_epoch30','PointNet_site_3layer_5A_epoch46', 'PointNet_site_3layer_9A_epoch37', 'DGCNN_site_1layer_k40_epoch46','DGCNN_site_1layer_k100_epoch32','DGCNN_site_3layer_k40_epoch33']\n", "\n", "experiment_names_short = ['Ours 1L 5A', 'Ours 1L 9A', 'Ours 1L 15A','Ours 3L 5A','Ours 3L 9A', 'Ours 3L 15A','PN++ 1L 5A','PN++ 1L 9A','PN++ 3L 5A', 'PN++ 3L 9A', 'DGCNN 1L K40','DGCNN 1L K100','DGCNN 3L K40']" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "performance = []\n", "times = []\n", "time_errors = []\n", "memory = []\n", "memory_errors = []\n", "for experiment_name in experiment_names:\n", "\n", " predpoints_preds = np.load(timings/f'{experiment_name}_predpoints_preds.npy')\n", " predpoints_labels = np.load(timings/f'{experiment_name}_predpoints_labels.npy')\n", "\n", " rocauc = roc_auc_score(predpoints_labels,predpoints_preds)\n", " conv_times = np.load(timings/f'{experiment_name}_convtime.npy')\n", " memoryusage = np.load(timings/f'{experiment_name}_memoryusage.npy')\n", " memoryusage = memoryusage\n", " conv_times = conv_times\n", "\n", " performance.append(rocauc)\n", " times.append(conv_times.mean())\n", " time_errors.append(conv_times.std())\n", " memory.append(memoryusage.mean())\n", " memory_errors.append(memoryusage.std())\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'colors' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mmemory_errors\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m125881554.73354617\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mexperiment_names_short\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'MaSIF 3L 9A'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mcolors\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m40\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'colors' is not defined" ] } ], "source": [ "performance += [0.849]\n", "times += [0.16402676922934395]\n", "time_errors += [0.04377787154914341]\n", "memory += [1491945956.9371428]\n", "memory_errors += [125881554.73354617]\n", "experiment_names_short += ['MaSIF 3L 9A']\n", "colors += [40]" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [], "source": [ "experiment_names_short = [f'{i+1}) {experiment_names_short[i]}' for i in range(len(experiment_names_short))]" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [], "source": [ "times = np.array(times)*1e3\n", "time_errors = np.array(time_errors)*1e3\n", "memory = np.array(memory)*1e-6\n", "memory_errors = np.array(memory_errors)*1e-6" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [], "source": [ "colors = [f'hsl(240,100,{25+i*10.83})' for i in range(6)]+[f'hsl(116,100,{25+i*16.25})' for i in range(4)] + [f'hsl(300,100,{25+i*21.66})' for i in range(3)] + [f'hsl(0,100,50)']" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_x": { "array": [ 5.528649900345416 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,25.0)" }, "mode": "markers", "name": "1) Ours 1L 5A", "type": "scatter", "x": [ 17.535469505224334 ], "y": [ 0.8225412991271486 ] }, { "error_x": { "array": [ 5.350953992665304 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,35.83)" }, "mode": "markers", "name": "2) Ours 1L 9A", "type": "scatter", "x": [ 17.492798607001145 ], "y": [ 0.8367986600715068 ] }, { "error_x": { "array": [ 5.059301312807847 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,46.66)" }, "mode": "markers", "name": "3) Ours 1L 15A", "type": "scatter", "x": [ 16.42768771460887 ], "y": [ 0.8482431749127568 ] }, { "error_x": { "array": [ 11.514541370139163 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,57.49)" }, "mode": "markers", "name": "4) Ours 3L 5A", "type": "scatter", "x": [ 37.07474871967616 ], "y": [ 0.8597660324128116 ] }, { "error_x": { "array": [ 8.34115514119933 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,68.32)" }, "mode": "markers", "name": "5) Ours 3L 9A", "type": "scatter", "x": [ 36.484644654091824 ], "y": [ 0.8650878613609656 ] }, { "error_x": { "array": [ 9.779105276725772 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,79.15)" }, "mode": "markers", "name": "6) Ours 3L 15A", "type": "scatter", "x": [ 37.16418247544364 ], "y": [ 0.8652432682847265 ] }, { "error_x": { "array": [ 42.56794581171482 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,25.0)" }, "mode": "markers", "name": "7) PN++ 1L 5A", "type": "scatter", "x": [ 119.55246094907268 ], "y": [ 0.7630142728601188 ] }, { "error_x": { "array": [ 46.116139703391454 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,41.25)" }, "mode": "markers", "name": "8) PN++ 1L 9A", "type": "scatter", "x": [ 142.3990974265538 ], "y": [ 0.7813292855857769 ] }, { "error_x": { "array": [ 130.85731976553717 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,57.5)" }, "mode": "markers", "name": "9) PN++ 3L 5A", "type": "scatter", "x": [ 408.70048490802895 ], "y": [ 0.8307825342234235 ] }, { "error_x": { "array": [ 145.10523903835377 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,73.75)" }, "mode": "markers", "name": "10) PN++ 3L 9A", "type": "scatter", "x": [ 481.70145241062295 ], "y": [ 0.8362551391657013 ] }, { "error_x": { "array": [ 8.374631224369965 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,25.0)" }, "mode": "markers", "name": "11) DGCNN 1L K40", "type": "scatter", "x": [ 50.077644626746014 ], "y": [ 0.7070177689304884 ] }, { "error_x": { "array": [ 76.62718877387721 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,46.66)" }, "mode": "markers", "name": "12) DGCNN 1L K100", "type": "scatter", "x": [ 395.29052812061957 ], "y": [ 0.6838021020108864 ] }, { "error_x": { "array": [ 9.72896160688735 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,68.32)" }, "mode": "markers", "name": "13) DGCNN 3L K40", "type": "scatter", "x": [ 71.05260417702493 ], "y": [ 0.7081438400632245 ] }, { "error_x": { "array": [ 43.777871549143406 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(0,100,50)" }, "mode": "markers", "name": "14) MaSIF 3L 9A", "type": "scatter", "x": [ 164.02676922934396 ], "y": [ 0.849 ] } ], "layout": { "legend": { "title": { "text": "Models" } }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "xaxis": { "tickvals": [ 10, 20, 40, 60, 80, 100, 200, 400, 600 ], "title": { "text": "Forward pass time per protein [ms] (log)" }, "type": "log" }, "yaxis": { "title": { "text": "Site identification ROC-AUC" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = go.Figure()\n", "for i in range(len(times)):\n", " fig.add_trace(go.Scatter(\n", " x=[times[i]],\n", " y=[performance[i]],\n", " mode='markers',\n", " name=experiment_names_short[i],\n", " marker = dict(color=colors[i]),\n", " error_x=dict(\n", " type='data',\n", " symmetric=True,\n", " array=[time_errors[i]])))\n", "\n", "\n", "fig.update_layout(\n", " xaxis_title='Forward pass time per protein [ms] (log)',\n", " yaxis_title='Site identification ROC-AUC',\n", " legend_title=\"Models\",\n", ")\n", "fig.update_xaxes(type=\"log\")\n", "fig.update_layout(\n", " xaxis = dict(\n", " tickvals = [1e1,2e1,4e1,6e1,8e1,1e2,2e2,4e2,6e2],\n", " #tickvals = [10, 20, 50, 100, 200, 500],\n", " )\n", ")\n", "\n", "fig.show()\n", "fig.write_image('figures/time_vs_perf.pdf')" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_x": { "array": [ 19.951238544987916 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,25.0)" }, "mode": "markers", "name": "1) Ours 1L 5A", "type": "scatter", "x": [ 131.44750166292135 ], "y": [ 0.8225412991271486 ] }, { "error_x": { "array": [ 19.951238544987916 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,35.83)" }, "mode": "markers", "name": "2) Ours 1L 9A", "type": "scatter", "x": [ 131.44750166292135 ], "y": [ 0.8367986600715068 ] }, { "error_x": { "array": [ 19.951238544987916 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,46.66)" }, "mode": "markers", "name": "3) Ours 1L 15A", "type": "scatter", "x": [ 131.44750166292135 ], "y": [ 0.8482431749127568 ] }, { "error_x": { "array": [ 20.57705066924205 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,57.49)" }, "mode": "markers", "name": "4) Ours 3L 5A", "type": "scatter", "x": [ 131.8553786966292 ], "y": [ 0.8597660324128116 ] }, { "error_x": { "array": [ 20.57705066924205 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,68.32)" }, "mode": "markers", "name": "5) Ours 3L 9A", "type": "scatter", "x": [ 131.8553786966292 ], "y": [ 0.8650878613609656 ] }, { "error_x": { "array": [ 20.57705066924205 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(240,100,79.15)" }, "mode": "markers", "name": "6) Ours 3L 15A", "type": "scatter", "x": [ 131.8553786966292 ], "y": [ 0.8652432682847265 ] }, { "error_x": { "array": [ 469.7109731645726 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,25.0)" }, "mode": "markers", "name": "7) PN++ 1L 5A", "type": "scatter", "x": [ 3025.723793258427 ], "y": [ 0.7630142728601188 ] }, { "error_x": { "array": [ 477.6390960312726 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,41.25)" }, "mode": "markers", "name": "8) PN++ 1L 9A", "type": "scatter", "x": [ 3068.2044663370784 ], "y": [ 0.7813292855857769 ] }, { "error_x": { "array": [ 619.4290980168416 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,57.5)" }, "mode": "markers", "name": "9) PN++ 3L 5A", "type": "scatter", "x": [ 3952.2142719999997 ], "y": [ 0.8307825342234235 ] }, { "error_x": { "array": [ 627.3884255777202 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(116,100,73.75)" }, "mode": "markers", "name": "10) PN++ 3L 9A", "type": "scatter", "x": [ 3995.110192898876 ], "y": [ 0.8362551391657013 ] }, { "error_x": { "array": [ 100.63408144310193 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,25.0)" }, "mode": "markers", "name": "11) DGCNN 1L K40", "type": "scatter", "x": [ 641.8060785617977 ], "y": [ 0.7070177689304884 ] }, { "error_x": { "array": [ 253.22976173261787 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,46.66)" }, "mode": "markers", "name": "12) DGCNN 1L K100", "type": "scatter", "x": [ 1680.5417391460674 ], "y": [ 0.6838021020108864 ] }, { "error_x": { "array": [ 100.32882494334173 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(300,100,68.32)" }, "mode": "markers", "name": "13) DGCNN 3L K40", "type": "scatter", "x": [ 641.7386973483146 ], "y": [ 0.7081438400632245 ] }, { "error_x": { "array": [ 125.88155473354617 ], "symmetric": true, "type": "data" }, "marker": { "color": "hsl(0,100,50)" }, "mode": "markers", "name": "14) MaSIF 3L 9A", "type": "scatter", "x": [ 1491.9459569371427 ], "y": [ 0.849 ] } ], "layout": { "legend": { "title": { "text": "Models" } }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "xaxis": { "tickvals": [ 100, 200, 400, 600, 800, 1000, 2000, 4000 ], "title": { "text": "Memory usage per protein [MB] (log)" }, "type": "log" }, "yaxis": { "title": { "text": "Site identification ROC-AUC" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = go.Figure()\n", "for i in range(len(times)):\n", " fig.add_trace(go.Scatter(\n", " x=[memory[i]],\n", " y=[performance[i]],\n", " mode='markers',\n", " marker = dict(color=colors[i]),\n", " name=experiment_names_short[i],\n", " error_x=dict(\n", " type='data',\n", " symmetric=True,\n", " array=[memory_errors[i]])))\n", "\n", "\n", "fig.update_layout(\n", " xaxis_title='Memory usage per protein [MB] (log)',\n", " yaxis_title='Site identification ROC-AUC',\n", " legend_title=\"Models\",\n", ")\n", "fig.update_xaxes(type=\"log\")\n", "fig.update_layout(\n", " xaxis = dict(\n", " tickvals = [100,200,400,600,800,1000,2000,4000],\n", " )\n", ")\n", "fig.show()\n", "fig.write_image('figures/mem_vs_perf.pdf')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: data_analysis/plot_search.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python37764bitvenv9d3d77f519b14852b6e336264c4e59e7", "display_name": "Python 3.7.7 64-bit ('venv')", "language": "python" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt \n", "from pathlib import Path\n", "from sklearn.metrics import roc_auc_score" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "roc_dir = Path('./roc_curves')\n", "experiment_names = ['TangentConv_search_3L_16dim_12A_FIXED_binet_gc_subsamp50_epoch25',\n", "'TangentConv_search_3L_16dim_12A_FIXED_binet_gc_epoch28','masif']\n", "short_names = ['dmasif Sub-samp 50','dmasif Sub-samp 20','MaSIF']" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "dmasif Sub-samp 50 0.8619284441342503\n", "dmasif Sub-samp 20 0.811592854419193\n", "MaSIF 0.8134732697686253\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 14 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-12-22T13:19:59.238850\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "for exp,sn in zip(experiment_names,short_names):\n", " fpr = np.load(roc_dir/f'{exp}_fpr.npy')\n", " tpr = np.load(roc_dir/f'{exp}_tpr.npy')\n", " labels = np.load(roc_dir/f'{exp}_all_labels.npy')\n", " preds = np.load(roc_dir/f'{exp}_all_preds.npy')\n", " print(sn,roc_auc_score(labels,preds))\n", " plt.plot(fpr,tpr,label=sn)\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: data_analysis/profiling_surface.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python37764bitvenv9d3d77f519b14852b6e336264c4e59e7", "display_name": "Python 3.7.7 64-bit ('venv')", "language": "python" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import numpy as np \n", "import matplotlib.pyplot as plt\n", "import plotly.graph_objects as go\n", "from plotly.subplots import make_subplots\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "batch_sizes = [2**i for i in range(8)]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "error", "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: '../timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_generation_times_1.npy'", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mmemory_std\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msize\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mbatch_sizes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mtimes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'../timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_generation_times_{size}.npy'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mmemory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'../timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_all_memory_usage_batch_{size}.npy'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mmemory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmemory\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m1e-6\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/GitHub/protein_tangentconv/venv/lib/python3.7/site-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mload\u001b[0;34m(file, mmap_mode, allow_pickle, fix_imports, encoding)\u001b[0m\n\u001b[1;32m 414\u001b[0m \u001b[0mown_fid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 415\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 416\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstack\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menter_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos_fspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"rb\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 417\u001b[0m \u001b[0mown_fid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 418\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_generation_times_1.npy'" ] } ], "source": [ "time_means = []\n", "time_std = []\n", "memory_means = []\n", "memory_std = []\n", "for size in batch_sizes:\n", " times = np.load(f'timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_generation_times_{size}.npy')\n", " memory = np.load(f'timings/TangentConv_benchmark_1layer_pointmatching_faster_fixed_randNeg_correctData_biConv_16dim_epoch79_surfacegen_all_memory_usage_batch_{size}.npy')\n", " memory = memory*1e-6\n", " time_means.append(times.mean())\n", " memory_means.append(memory.mean())\n", " time_std.append(times.std())\n", " memory_std.append(memory.std())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.plot(batch_sizes,time_means)\n", "plt.xlabel('Batch size')\n", "plt.ylabel('Mean surface generation time per protein [s]')\n", "plt.xscale('log')\n", "plt.yscale('log')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.plot(batch_sizes,memory_means)\n", "plt.xlabel('Batch size')\n", "plt.ylabel('Mean GPU memory usage per protein [MB]')\n", "plt.xscale('log')\n", "plt.yscale('log')" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.09661842517474258, 0.06524675196323244, 0.050105717083475367, 0.041534353552926, 0.03441623031242543, 0.024559428491832888, 0.020793476199996448, 0.0187925904966869 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 0.45163814779518985, 0.24425267262211378, 0.14348937780316984, 0.09967912195515734, 0.08389908946316008, 0.07489164349649494, 0.07219395963414238, 0.07024341275858338 ], "yaxis": "y" }, { "error_y": { "array": [ 74.97409732852165, 38.10489460753547, 21.12448649347617, 12.978408364333657, 14.526095781510266, 3.534258518508427, 3.1682868928673944, 4.103064352455909 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 235.51553588420123, 141.17300474126367, 84.75973699929428, 52.13240810155147, 33.94076232112676, 22.832835124917384, 17.35099339607843, 14.68553105370844 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "shapes": [ { "line": { "color": "Blue", "dash": "dot" }, "type": "line", "x0": 1, "x1": 128, "y0": 6.11, "y1": 6.11 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "tickvals": [ 1, 2, 4, 6, 8, 10, 20, 40, 60, 80, 100, 200, 400 ], "title": { "text": "Batch size" }, "type": "log" }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "range": [ -1.5, 1 ], "tickvals": [ 0.04, 0.06, 0.08, 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10 ], "title": { "text": "Mean surface generation time per protein [s]" }, "type": "log" }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "tickvals": [ 10, 20, 40, 60, 80, 100, 200, 400 ], "title": { "text": "Mean GPU memory usage per protein [MB]" }, "type": "log" } } }, "text/html": "
" }, "metadata": {} } ], "source": [ "fig = make_subplots(specs=[[{\"secondary_y\": True}]])\n", "fig.add_trace(\n", " go.Scatter(x=batch_sizes, y=time_means, name=\"Time\", marker_size=12, marker_symbol='star', error_y=dict(type='data',array=time_std,visible=True)),\n", " secondary_y=False,\n", ")\n", "\n", "fig.add_trace(\n", " go.Scatter(x=batch_sizes, y=memory_means, name=\"Memory\", marker_symbol='square', marker_size=10,error_y=dict(type='data',array=memory_std,visible=True)),\n", " secondary_y=True,\n", ")\n", "\n", "fig.add_shape(type='line',\n", " x0=1,\n", " y0=6.11,\n", " x1=128,\n", " y1=6.11,\n", " line=dict(color='Blue',dash = 'dot'))\n", "\n", "fig.update_xaxes(title_text=\"Batch size\",tickvals = [1,2,4,6,8,10,20,40,60,80,100,200,400])\n", "fig.update_yaxes(title_text=\"Mean surface generation time per protein [s]\", secondary_y=False,color='blue')\n", "fig.update_yaxes(title_text=\"Mean GPU memory usage per protein [MB]\", secondary_y=True,color='red',tickvals = [10,20,40,60,80,100,200,400])\n", "\n", "\n", "fig.update_xaxes(type=\"log\")\n", "fig.update_yaxes(type=\"log\")\n", "\n", "fig.update_yaxes(secondary_y=False,tickvals = [0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1,2,4,6,8,10])\n", "fig.update_yaxes(secondary_y=False,range=[-1.5,1])\n", "\n", "\n", "\n", "fig.update_layout(\n", " autosize=False,\n", " width=1000,\n", " height=800,\n", " font=dict(\n", " size=18,\n", " ))\n", "\n", "\n", "\n", "fig.show()\n", "fig.write_image(\"figures/surfgen_profile.pdf\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "keys = ['surface', 'features', 'coordinates']\n", "batch_size = 1\n", "resolutions = [0.5,1.0,2.0,4.0]\n", "sup_samplings = [40,20,10,5]\n", "N = len(resolutions)\n", "\n", "time_means = []\n", "time_std = []\n", "memory_means = []\n", "memory_std = []\n", "for i in range(N):\n", " times = np.load(f'../timings/step_profiling_{keys[0]}_times_batch_{batch_size}_res_{resolutions[i]}_B_{sup_samplings[i]}.npy')\n", " memory = np.load(f'../timings/step_profiling_{keys[0]}_memory_batch_{batch_size}_res_{resolutions[i]}_B_{sup_samplings[i]}.npy')\n", " memory = memory*1e-6\n", " time_means.append(times.mean())\n", " memory_means.append(memory.mean())\n", " time_std.append(times.std())\n", " memory_std.append(memory.std())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.18533073533808336, 0.09680264243368539, 0.04991310328653822, 0.028676412920893138 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 0.1790069231814446, 0.12131211667174485, 0.09353480621028136, 0.08197236860734851 ], "yaxis": "y" }, { "error_y": { "array": [ 150.13888736862992, 74.29559611714842, 37.561338753611665, 19.194383313465114 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 499.09659836893195, 249.11686125472195, 125.12769170414828, 63.120192169461596 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "title": { "text": "Resolution" } }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "title": { "text": "Mean time per protein [s]" } }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.043876299933383066, 0.007938229059877963, 0.0028496638923647473, 0.002479871190179921 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 0.06476160570887055, 0.028156291123311916, 0.019225212902698702, 0.01614426036693307 ], "yaxis": "y" }, { "error_y": { "array": [ 15.748010034470598, 5.800258135139271, 2.2001731549839607, 1.083678960105017 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 33.39329525154457, 12.603112410944396, 4.8790290301853485, 2.3700945454545455 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "title": { "text": "Resolution" } }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "title": { "text": "Mean time per protein [s]" } }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.0034462911768476357, 0.0006948794730123882, 0.0007856585140201795, 0.00046908884903664025 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 0.006644930422884747, 0.00391388593894238, 0.003369788416486237, 0.0031363786266424545 ], "yaxis": "y" }, { "error_y": { "array": [ 4.3085336393399185, 1.8445861098663745, 0.9905885268813438, 0.7236619627005592 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 0.5, 1, 2, 4 ], "xaxis": "x", "y": [ 10.0491348956752, 4.3401819735216245, 2.244365918446602, 1.5685022842012357 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "title": { "text": "Resolution" } }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "title": { "text": "Mean time per protein [s]" } }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} } ], "source": [ "keys = ['surface', 'features', 'coordinates']\n", "for key in keys:\n", " batch_size = 1\n", " resolutions = [0.5,1.0,2.0,4.0]\n", " sup_samplings = [40,20,10,5]\n", " N = len(resolutions)\n", "\n", " time_means = []\n", " time_std = []\n", " memory_means = []\n", " memory_std = []\n", " for i in range(N):\n", " times = np.load(f'../timings/step_profiling_{key}_times_batch_{batch_size}_res_{resolutions[i]}_B_{sup_samplings[i]}.npy')\n", " memory = np.load(f'../timings/step_profiling_{key}_memory_batch_{batch_size}_res_{resolutions[i]}_B_{sup_samplings[i]}.npy')\n", " memory = memory*1e-6\n", " time_means.append(times.mean())\n", " memory_means.append(memory.mean())\n", " time_std.append(times.std())\n", " memory_std.append(memory.std())\n", "\n", "\n", " fig = make_subplots(specs=[[{\"secondary_y\": True}]])\n", " fig.add_trace(\n", " go.Scatter(x=resolutions, y=time_means, name=\"Time\", marker_size=12, marker_symbol='star', error_y=dict(type='data',array=time_std,visible=True)),\n", " secondary_y=False,\n", " )\n", "\n", " fig.add_trace(\n", " go.Scatter(x=resolutions, y=memory_means, name=\"Memory\", marker_symbol='square', marker_size=10,error_y=dict(type='data',array=memory_std,visible=True)),\n", " secondary_y=True,\n", " )\n", "\n", "\n", "\n", " fig.update_xaxes(title_text=\"Resolution\")\n", " fig.update_yaxes(title_text=\"Mean time per protein [s]\", secondary_y=False,color='blue')\n", " fig.update_yaxes(title_text=\"Mean GPU memory usage per protein [MB]\", secondary_y=True,color='red')\n", "\n", "\n", "\n", " #fig.update_yaxes(secondary_y=False,tickvals = [0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1,2,4,6,8,10])\n", " #fig.update_yaxes(secondary_y=False,range=[-1.5,1])\n", "\n", "\n", "\n", " fig.update_layout(\n", " autosize=False,\n", " width=1000,\n", " height=800,\n", " font=dict(\n", " size=18,\n", " ))\n", "\n", "\n", "\n", " fig.show()\n", " fig.write_image(f'../figures/resolution_profiling_{key}.pdf')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.09680264243368539, 0.06738993484603377, 0.0473130424679464, 0.034063817690196785, 0.02547246718384354, 0.019620533496723443, 0.016807760176632967, 0.015233961971048775 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 0.12131211667174485, 0.09242735506997611, 0.07528613803247036, 0.06658043688207822, 0.062034064174537926, 0.059370067822503786, 0.058075338027446105, 0.05898624869739957 ], "yaxis": "y" }, { "error_y": { "array": [ 74.29559611714842, 37.54999437002707, 20.930336140004194, 13.567087319706069, 14.138378829235164, 3.6299869360967123, 3.2017728039015765, 4.3052114138489035 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 249.11686125472195, 148.49957338228026, 88.60460750317571, 53.76497624823695, 34.880394997183096, 23.698022699272965, 17.860115529411765, 15.111303670076724 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "shapes": [ { "line": { "color": "Blue", "dash": "dot" }, "type": "line", "x0": 1, "x1": 128, "y0": 6.11, "y1": 6.11 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "tickvals": [ 1, 2, 4, 6, 8, 10, 20, 40, 60, 80, 100, 200 ], "title": { "text": "Batch size (log)" }, "type": "log" }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "range": [ -1.5, 1 ], "tickvals": [ 0.04, 0.06, 0.08, 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10 ], "title": { "text": "Mean time per protein [s] (log)" }, "type": "log" }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.007938229059877963, 0.005599115237226402, 0.003436053099386169, 0.0026162141417493227, 0.0024595882701286694, 0.001510256168281658, 0.0012896325307049882, 0.001218444426710108 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 0.028156291123311916, 0.01728601553311333, 0.011362970001527603, 0.008698523864255132, 0.00775169205497688, 0.006921940354503548, 0.006502017933948367, 0.006592512766704383 ], "yaxis": "y" }, { "error_y": { "array": [ 5.800258135139271, 4.154069059070635, 3.0990891079110425, 2.3478156483136976, 1.9802106738241176, 1.4667302779393956, 1.3583250352936223, 1.4001488541791103 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 12.603112410944396, 12.579492552064947, 12.66682982074806, 12.659586888575458, 12.751314569014083, 12.672998281559813, 12.600580789542482, 12.661068301790282 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "shapes": [ { "line": { "color": "Blue", "dash": "dot" }, "type": "line", "x0": 1, "x1": 128, "y0": 19.69, "y1": 19.69 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "tickvals": [ 1, 2, 4, 6, 8, 10, 20, 40, 60, 80, 100, 200 ], "title": { "text": "Batch size (log)" }, "type": "log" }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "range": [ -2.5, 1.5 ], "tickvals": [ 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20 ], "title": { "text": "Mean time per protein [s] (log)" }, "type": "log" }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "error_y": { "array": [ 0.0006948794730123882, 0.00041587214364136103, 0.00036377932091529743, 0.0002134561690764115, 0.0002536135187275087, 0.00015024880768163085, 0.00009095317204787343, 0.00008709739761340829 ], "type": "data", "visible": true }, "marker": { "size": 12, "symbol": "star" }, "name": "Time", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 0.00391388593894238, 0.002163549004786014, 0.001249552614350679, 0.0008347560723846823, 0.0006608473373131013, 0.0005315618241120866, 0.0004603021869472429, 0.00045832309781399834 ], "yaxis": "y" }, { "error_y": { "array": [ 1.8445861098663745, 1.326871259668138, 1.0156415521208961, 0.7785751314064158, 0.7269693020078153, 0.4891041190314188, 0.4796491370767668, 0.6993207818661091 ], "type": "data", "visible": true }, "marker": { "size": 10, "symbol": "square" }, "name": "Memory", "type": "scatter", "x": [ 1, 2, 4, 8, 16, 32, 64, 128 ], "xaxis": "x", "y": [ 4.3401819735216245, 4.314389777620896, 4.388101194071983, 4.390260084626234, 4.443850952112675, 4.402911825512227, 4.33979808366013, 4.359717557544757 ], "yaxis": "y2" } ], "layout": { "autosize": false, "font": { "size": 18 }, "height": 800, "shapes": [ { "line": { "color": "Blue", "dash": "dot" }, "type": "line", "x0": 1, "x1": 128, "y0": 50.65, "y1": 50.65 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0, 0.94 ], "tickvals": [ 1, 2, 4, 6, 8, 10, 20, 40, 60, 80, 100, 200 ], "title": { "text": "Batch size (log)" }, "type": "log" }, "yaxis": { "anchor": "x", "color": "blue", "domain": [ 0, 1 ], "range": [ -3.5, 2 ], "tickvals": [ 0.0005, 0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50 ], "title": { "text": "Mean time per protein [s] (log)" }, "type": "log" }, "yaxis2": { "anchor": "x", "color": "red", "overlaying": "y", "side": "right", "title": { "text": "Mean GPU memory usage per protein [MB]" } } } }, "text/html": "
" }, "metadata": {} } ], "source": [ "keys = ['surface', 'features', 'coordinates']\n", "for key in keys:\n", " batch_sizes = [1,2,4,8,16,32,64,128]\n", " resolution = 1.0\n", " sup_sampling = 20\n", " N = len(batch_sizes)\n", "\n", " time_means = []\n", " time_std = []\n", " memory_means = []\n", " memory_std = []\n", " for i in range(N):\n", " times = np.load(f'../timings/step_profiling_{key}_times_batch_{batch_sizes[i]}_res_{resolution}_B_{sup_sampling}.npy')\n", " memory = np.load(f'../timings/step_profiling_{key}_memory_batch_{batch_sizes[i]}_res_{resolution}_B_{sup_sampling}.npy')\n", " memory = memory*1e-6\n", " time_means.append(times.mean())\n", " memory_means.append(memory.mean())\n", " time_std.append(times.std())\n", " memory_std.append(memory.std())\n", "\n", "\n", " fig = make_subplots(specs=[[{\"secondary_y\": True}]])\n", " fig.add_trace(\n", " go.Scatter(x=batch_sizes, y=time_means, name=\"Time\", marker_size=12, marker_symbol='star', error_y=dict(type='data',array=time_std,visible=True)),\n", " secondary_y=False,\n", " )\n", "\n", " fig.add_trace(\n", " go.Scatter(x=batch_sizes, y=memory_means, name=\"Memory\", marker_symbol='square', marker_size=10,error_y=dict(type='data',array=memory_std,visible=True)),\n", " secondary_y=True,\n", " )\n", "\n", " if key=='surface':\n", " fig.add_shape(type='line',\n", " x0=1,\n", " y0=6.11,\n", " x1=128,\n", " y1=6.11,\n", " line=dict(color='Blue',dash = 'dot'))\n", " elif key=='features':\n", " fig.add_shape(type='line',\n", " x0=1,\n", " y0=19.69,\n", " x1=128,\n", " y1=19.69,\n", " line=dict(color='Blue',dash = 'dot'))\n", " elif key=='coordinates':\n", " fig.add_shape(type='line',\n", " x0=1,\n", " y0=50.65,\n", " x1=128,\n", " y1=50.65,\n", " line=dict(color='Blue',dash = 'dot'))\n", "\n", "\n", "\n", " fig.update_xaxes(title_text=\"Batch size (log)\",tickvals = [1,2,4,6,8,10,20,40,60,80,100,200])\n", " fig.update_yaxes(title_text=\"Mean time per protein [s] (log)\", secondary_y=False,color='blue')\n", " fig.update_yaxes(title_text=\"Mean GPU memory usage per protein [MB]\", secondary_y=True,color='red')\n", "\n", " fig.update_xaxes(type=\"log\")\n", " fig.update_yaxes(secondary_y=False,type=\"log\")\n", " if key == 'surface':\n", " fig.update_yaxes(secondary_y=False,tickvals = [0.04,0.06,0.08,0.1,0.2,0.4,0.6,0.8,1,2,4,6,8,10])\n", " fig.update_yaxes(secondary_y=False,range=[-1.5,1])\n", " elif key=='features':\n", " fig.update_yaxes(secondary_y=False,tickvals = [0.005,0.01,0.02,0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20])\n", " fig.update_yaxes(secondary_y=False,range=[-2.5,1.5]) \n", " elif key == 'coordinates':\n", " #fig.update_yaxes(secondary_y=False,tickvals = [4e-4,6e-4,8e-4,10e-4,2e-3,4e-3])\n", " fig.update_yaxes(secondary_y=False,tickvals = [0.0005,0.001,0.002,0.005,0.01,0.02,0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20,50])\n", " fig.update_yaxes(secondary_y=False,range=[-3.5,2]) \n", "\n", " #fig.update_yaxes(secondary_y=False,range=[-1.5,1])\n", "\n", "\n", "\n", " fig.update_layout(\n", " autosize=False,\n", " width=1000,\n", " height=800,\n", " font=dict(\n", " size=18,\n", " ))\n", "\n", "\n", "\n", " fig.show()\n", " fig.write_image(f'../figures/batchsize_profiling_{key}_izar.pdf')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: data_iteration.py ================================================ import torch import numpy as np from helper import * import torch.nn as nn import torch.nn.functional as F import torch.autograd.profiler as profiler from sklearn.metrics import roc_auc_score from pathlib import Path import math from tqdm import tqdm from geometry_processing import save_vtk from helper import numpy, diagonal_ranges import time def process_single(protein_pair, chain_idx=1): """Turn the PyG data object into a dict.""" P = {} with_mesh = "face_p1" in protein_pair.keys preprocessed = "gen_xyz_p1" in protein_pair.keys if chain_idx == 1: # Ground truth labels are available on mesh vertices: P["mesh_labels"] = protein_pair.y_p1 if with_mesh else None # N.B.: The DataLoader should use the optional argument # "follow_batch=['xyz_p1', 'xyz_p2']", as described on the PyG tutorial. P["mesh_batch"] = protein_pair.xyz_p1_batch if with_mesh else None # Surface information: P["mesh_xyz"] = protein_pair.xyz_p1 if with_mesh else None P["mesh_triangles"] = protein_pair.face_p1 if with_mesh else None # Atom information: P["atoms"] = protein_pair.atom_coords_p1 P["batch_atoms"] = protein_pair.atom_coords_p1_batch # Chemical features: atom coordinates and types. P["atom_xyz"] = protein_pair.atom_coords_p1 P["atomtypes"] = protein_pair.atom_types_p1 P["xyz"] = protein_pair.gen_xyz_p1 if preprocessed else None P["normals"] = protein_pair.gen_normals_p1 if preprocessed else None P["batch"] = protein_pair.gen_batch_p1 if preprocessed else None P["labels"] = protein_pair.gen_labels_p1 if preprocessed else None elif chain_idx == 2: # Ground truth labels are available on mesh vertices: P["mesh_labels"] = protein_pair.y_p2 if with_mesh else None # N.B.: The DataLoader should use the optional argument # "follow_batch=['xyz_p1', 'xyz_p2']", as described on the PyG tutorial. P["mesh_batch"] = protein_pair.xyz_p2_batch if with_mesh else None # Surface information: P["mesh_xyz"] = protein_pair.xyz_p2 if with_mesh else None P["mesh_triangles"] = protein_pair.face_p2 if with_mesh else None # Atom information: P["atoms"] = protein_pair.atom_coords_p2 P["batch_atoms"] = protein_pair.atom_coords_p2_batch # Chemical features: atom coordinates and types. P["atom_xyz"] = protein_pair.atom_coords_p2 P["atomtypes"] = protein_pair.atom_types_p2 P["xyz"] = protein_pair.gen_xyz_p2 if preprocessed else None P["normals"] = protein_pair.gen_normals_p2 if preprocessed else None P["batch"] = protein_pair.gen_batch_p2 if preprocessed else None P["labels"] = protein_pair.gen_labels_p2 if preprocessed else None return P def save_protein_batch_single(protein_pair_id, P, save_path, pdb_idx): protein_pair_id = protein_pair_id.split("_") pdb_id = protein_pair_id[0] + "_" + protein_pair_id[pdb_idx] batch = P["batch"] xyz = P["xyz"] inputs = P["input_features"] embedding = P["embedding_1"] if pdb_idx == 1 else P["embedding_2"] emb_id = 1 if pdb_idx == 1 else 2 predictions = torch.sigmoid(P["iface_preds"]) if "iface_preds" in P.keys() else 0.0*embedding[:,0].view(-1, 1) labels = P["labels"].view(-1, 1) if P["labels"] is not None else 0.0 * predictions coloring = torch.cat([inputs, embedding, predictions, labels], axis=1) save_vtk(str(save_path / pdb_id) + f"_pred_emb{emb_id}", xyz, values=coloring) np.save(str(save_path / pdb_id) + "_predcoords", numpy(xyz)) np.save(str(save_path / pdb_id) + f"_predfeatures_emb{emb_id}", numpy(coloring)) def project_iface_labels(P, threshold=2.0): queries = P["xyz"] batch_queries = P["batch"] source = P["mesh_xyz"] batch_source = P["mesh_batch"] labels = P["mesh_labels"] x_i = LazyTensor(queries[:, None, :]) # (N, 1, D) y_j = LazyTensor(source[None, :, :]) # (1, M, D) D_ij = ((x_i - y_j) ** 2).sum(-1) # (N, M) D_ij.ranges = diagonal_ranges(batch_queries, batch_source) nn_i = D_ij.argmin(dim=1).view(-1) # (N,) nn_dist_i = ( D_ij.min(dim=1).view(-1, 1) < threshold ).float() # If chain is not connected because of missing densities MaSIF cut out a part of the protein query_labels = labels[nn_i] * nn_dist_i P["labels"] = query_labels def process(args, protein_pair, net): P1 = process_single(protein_pair, chain_idx=1) if not "gen_xyz_p1" in protein_pair.keys: net.preprocess_surface(P1) #if P1["mesh_labels"] is not None: # project_iface_labels(P1) P2 = None if not args.single_protein: P2 = process_single(protein_pair, chain_idx=2) if not "gen_xyz_p2" in protein_pair.keys: net.preprocess_surface(P2) #if P2["mesh_labels"] is not None: # project_iface_labels(P2) return P1, P2 def generate_matchinglabels(args, P1, P2): if args.random_rotation: P1["xyz"] = torch.matmul(P1["rand_rot"].T, P1["xyz"].T).T + P1["atom_center"] P2["xyz"] = torch.matmul(P2["rand_rot"].T, P2["xyz"].T).T + P2["atom_center"] xyz1_i = LazyTensor(P1["xyz"][:, None, :].contiguous()) xyz2_j = LazyTensor(P2["xyz"][None, :, :].contiguous()) xyz_dists = ((xyz1_i - xyz2_j) ** 2).sum(-1).sqrt() xyz_dists = (1.0 - xyz_dists).step() p1_iface_labels = (xyz_dists.sum(1) > 1.0).float().view(-1) p2_iface_labels = (xyz_dists.sum(0) > 1.0).float().view(-1) P1["labels"] = p1_iface_labels P2["labels"] = p2_iface_labels def compute_loss(args, P1, P2, n_points_sample=16): if args.search: pos_xyz1 = P1["xyz"][P1["labels"] == 1] pos_xyz2 = P2["xyz"][P2["labels"] == 1] pos_descs1 = P1["embedding_1"][P1["labels"] == 1] pos_descs2 = P2["embedding_2"][P2["labels"] == 1] pos_xyz_dists = ( ((pos_xyz1[:, None, :] - pos_xyz2[None, :, :]) ** 2).sum(-1).sqrt() ) pos_desc_dists = torch.matmul(pos_descs1, pos_descs2.T) pos_preds = pos_desc_dists[pos_xyz_dists < 1.0] pos_labels = torch.ones_like(pos_preds) n_desc_sample = 100 sample_desc2 = torch.randperm(len(P2["embedding_2"]))[:n_desc_sample] sample_desc2 = P2["embedding_2"][sample_desc2] neg_preds = torch.matmul(pos_descs1, sample_desc2.T).view(-1) neg_labels = torch.zeros_like(neg_preds) # For symmetry pos_descs1_2 = P1["embedding_2"][P1["labels"] == 1] pos_descs2_2 = P2["embedding_1"][P2["labels"] == 1] pos_desc_dists2 = torch.matmul(pos_descs2_2, pos_descs1_2.T) pos_preds2 = pos_desc_dists2[pos_xyz_dists.T < 1.0] pos_preds = torch.cat([pos_preds, pos_preds2], dim=0) pos_labels = torch.ones_like(pos_preds) sample_desc1_2 = torch.randperm(len(P1["embedding_2"]))[:n_desc_sample] sample_desc1_2 = P1["embedding_2"][sample_desc1_2] neg_preds_2 = torch.matmul(pos_descs2_2, sample_desc1_2.T).view(-1) neg_preds = torch.cat([neg_preds, neg_preds_2], dim=0) neg_labels = torch.zeros_like(neg_preds) else: pos_preds = P1["iface_preds"][P1["labels"] == 1] pos_labels = P1["labels"][P1["labels"] == 1] neg_preds = P1["iface_preds"][P1["labels"] == 0] neg_labels = P1["labels"][P1["labels"] == 0] n_points_sample = len(pos_labels) pos_indices = torch.randperm(len(pos_labels))[:n_points_sample] neg_indices = torch.randperm(len(neg_labels))[:n_points_sample] pos_preds = pos_preds[pos_indices] pos_labels = pos_labels[pos_indices] neg_preds = neg_preds[neg_indices] neg_labels = neg_labels[neg_indices] preds_concat = torch.cat([pos_preds, neg_preds]) labels_concat = torch.cat([pos_labels, neg_labels]) loss = F.binary_cross_entropy_with_logits(preds_concat, labels_concat) return loss, preds_concat, labels_concat def extract_single(P_batch, number): P = {} # First and second proteins batch = P_batch["batch"] == number batch_atoms = P_batch["batch_atoms"] == number with_mesh = P_batch["labels"] is not None # Ground truth labels are available on mesh vertices: P["labels"] = P_batch["labels"][batch] if with_mesh else None P["batch"] = P_batch["batch"][batch] # Surface information: P["xyz"] = P_batch["xyz"][batch] P["normals"] = P_batch["normals"][batch] # Atom information: P["atoms"] = P_batch["atoms"][batch_atoms] P["batch_atoms"] = P_batch["batch_atoms"][batch_atoms] # Chemical features: atom coordinates and types. P["atom_xyz"] = P_batch["atom_xyz"][batch_atoms] P["atomtypes"] = P_batch["atomtypes"][batch_atoms] return P def iterate( net, dataset, optimizer, args, test=False, save_path=None, pdb_ids=None, summary_writer=None, epoch_number=None, ): """Goes through one epoch of the dataset, returns information for Tensorboard.""" if test: net.eval() torch.set_grad_enabled(False) else: net.train() torch.set_grad_enabled(True) # Statistics and fancy graphs to summarize the epoch: info = [] total_processed_pairs = 0 # Loop over one epoch: for it, protein_pair in enumerate( tqdm(dataset) ): # , desc="Test " if test else "Train")): protein_batch_size = protein_pair.atom_coords_p1_batch[-1].item() + 1 if save_path is not None: batch_ids = pdb_ids[ total_processed_pairs : total_processed_pairs + protein_batch_size ] total_processed_pairs += protein_batch_size protein_pair.to(args.device) if not test: optimizer.zero_grad() # Generate the surface: torch.cuda.synchronize() surface_time = time.time() P1_batch, P2_batch = process(args, protein_pair, net) torch.cuda.synchronize() surface_time = time.time() - surface_time for protein_it in range(protein_batch_size): torch.cuda.synchronize() iteration_time = time.time() P1 = extract_single(P1_batch, protein_it) P2 = None if args.single_protein else extract_single(P2_batch, protein_it) if args.random_rotation: P1["rand_rot"] = protein_pair.rand_rot1.view(-1, 3, 3)[0] P1["atom_center"] = protein_pair.atom_center1.view(-1, 1, 3)[0] P1["xyz"] = P1["xyz"] - P1["atom_center"] P1["xyz"] = ( torch.matmul(P1["rand_rot"], P1["xyz"].T).T ).contiguous() P1["normals"] = ( torch.matmul(P1["rand_rot"], P1["normals"].T).T ).contiguous() if not args.single_protein: P2["rand_rot"] = protein_pair.rand_rot2.view(-1, 3, 3)[0] P2["atom_center"] = protein_pair.atom_center2.view(-1, 1, 3)[0] P2["xyz"] = P2["xyz"] - P2["atom_center"] P2["xyz"] = ( torch.matmul(P2["rand_rot"], P2["xyz"].T).T ).contiguous() P2["normals"] = ( torch.matmul(P2["rand_rot"], P2["normals"].T).T ).contiguous() else: P1["rand_rot"] = torch.eye(3, device=P1["xyz"].device) P1["atom_center"] = torch.zeros((1, 3), device=P1["xyz"].device) if not args.single_protein: P2["rand_rot"] = torch.eye(3, device=P2["xyz"].device) P2["atom_center"] = torch.zeros((1, 3), device=P2["xyz"].device) torch.cuda.synchronize() prediction_time = time.time() outputs = net(P1, P2) torch.cuda.synchronize() prediction_time = time.time() - prediction_time P1 = outputs["P1"] P2 = outputs["P2"] if args.search: generate_matchinglabels(args, P1, P2) if P1["labels"] is not None: loss, sampled_preds, sampled_labels = compute_loss(args, P1, P2) else: loss = torch.tensor(0.0) sampled_preds = None sampled_labels = None # Compute the gradient, update the model weights: if not test: torch.cuda.synchronize() back_time = time.time() loss.backward() optimizer.step() torch.cuda.synchronize() back_time = time.time() - back_time if it == protein_it == 0 and not test: for para_it, parameter in enumerate(net.atomnet.parameters()): if parameter.requires_grad: summary_writer.add_histogram( f"Gradients/Atomnet/para_{para_it}_{parameter.shape}", parameter.grad.view(-1), epoch_number, ) for para_it, parameter in enumerate(net.conv.parameters()): if parameter.requires_grad: summary_writer.add_histogram( f"Gradients/Conv/para_{para_it}_{parameter.shape}", parameter.grad.view(-1), epoch_number, ) for d, features in enumerate(P1["input_features"].T): summary_writer.add_histogram(f"Input features/{d}", features) if save_path is not None: save_protein_batch_single( batch_ids[protein_it], P1, save_path, pdb_idx=1 ) if not args.single_protein: save_protein_batch_single( batch_ids[protein_it], P2, save_path, pdb_idx=2 ) try: if sampled_labels is not None: roc_auc = roc_auc_score( np.rint(numpy(sampled_labels.view(-1))), numpy(sampled_preds.view(-1)), ) else: roc_auc = 0.0 except Exception as e: print("Problem with computing roc-auc") print(e) continue R_values = outputs["R_values"] info.append( dict( { "Loss": loss.item(), "ROC-AUC": roc_auc, "conv_time": outputs["conv_time"], "memory_usage": outputs["memory_usage"], }, # Merge the "R_values" dict into "info", with a prefix: **{"R_values/" + k: v for k, v in R_values.items()}, ) ) torch.cuda.synchronize() iteration_time = time.time() - iteration_time # Turn a list of dicts into a dict of lists: newdict = {} for k, v in [(key, d[key]) for d in info for key in d]: if k not in newdict: newdict[k] = [v] else: newdict[k].append(v) info = newdict # Final post-processing: return info def iterate_surface_precompute(dataset, net, args): processed_dataset = [] for it, protein_pair in enumerate(tqdm(dataset)): protein_pair.to(args.device) P1, P2 = process(args, protein_pair, net) if args.random_rotation: P1["rand_rot"] = protein_pair.rand_rot1 P1["atom_center"] = protein_pair.atom_center1 P1["xyz"] = ( torch.matmul(P1["rand_rot"].T, P1["xyz"].T).T + P1["atom_center"] ) P1["normals"] = torch.matmul(P1["rand_rot"].T, P1["normals"].T).T if not args.single_protein: P2["rand_rot"] = protein_pair.rand_rot2 P2["atom_center"] = protein_pair.atom_center2 P2["xyz"] = ( torch.matmul(P2["rand_rot"].T, P2["xyz"].T).T + P2["atom_center"] ) P2["normals"] = torch.matmul(P2["rand_rot"].T, P2["normals"].T).T protein_pair = protein_pair.to_data_list()[0] protein_pair.gen_xyz_p1 = P1["xyz"] protein_pair.gen_normals_p1 = P1["normals"] protein_pair.gen_batch_p1 = P1["batch"] protein_pair.gen_labels_p1 = P1["labels"] protein_pair.gen_xyz_p2 = P2["xyz"] protein_pair.gen_normals_p2 = P2["normals"] protein_pair.gen_batch_p2 = P2["batch"] protein_pair.gen_labels_p2 = P2["labels"] processed_dataset.append(protein_pair.to("cpu")) return processed_dataset ================================================ FILE: data_preprocessing/convert_pdb2npy.py ================================================ import numpy as np from pathlib import Path from tqdm import tqdm from Bio.PDB import * ele2num = {"C": 0, "H": 1, "O": 2, "N": 3, "S": 4, "SE": 5} def load_structure_np(fname, center): """Loads a .ply mesh to return a point cloud and connectivity.""" # Load the data parser = PDBParser() structure = parser.get_structure("structure", fname) atoms = structure.get_atoms() coords = [] types = [] for atom in atoms: coords.append(atom.get_coord()) types.append(ele2num[atom.element]) coords = np.stack(coords) types_array = np.zeros((len(types), len(ele2num))) for i, t in enumerate(types): types_array[i, t] = 1.0 # Normalize the coordinates, as specified by the user: if center: coords = coords - np.mean(coords, axis=0, keepdims=True) return {"xyz": coords, "types": types_array} def convert_pdbs(pdb_dir, npy_dir): print("Converting PDBs") for p in tqdm(pdb_dir.glob("*.pdb")): protein = load_structure_np(p, center=False) np.save(npy_dir / (p.stem + "_atomxyz.npy"), protein["xyz"]) np.save(npy_dir / (p.stem + "_atomtypes.npy"), protein["types"]) ================================================ FILE: data_preprocessing/convert_ply2npy.py ================================================ import numpy as np from pathlib import Path from tqdm import tqdm from plyfile import PlyData, PlyElement def load_surface_np(fname, center): """Loads a .ply mesh to return a point cloud and connectivity.""" # Load the data, and read the connectivity information: plydata = PlyData.read(str(fname)) triangles = np.vstack(plydata["face"].data["vertex_indices"]) # Normalize the point cloud, as specified by the user: points = np.vstack([[v[0], v[1], v[2]] for v in plydata["vertex"]]) if center: points = points - np.mean(points, axis=0, keepdims=True) nx = plydata["vertex"]["nx"] ny = plydata["vertex"]["ny"] nz = plydata["vertex"]["nz"] normals = np.stack([nx, ny, nz]).T # Interface labels iface_labels = plydata["vertex"]["iface"] # Features charge = plydata["vertex"]["charge"] hbond = plydata["vertex"]["hbond"] hphob = plydata["vertex"]["hphob"] features = np.stack([charge, hbond, hphob]).T return { "xyz": points, "triangles": triangles, "features": features, "iface_labels": iface_labels, "normals": normals, } def convert_plys(ply_dir, npy_dir): print("Converting PLYs") for p in tqdm(ply_dir.glob("*.ply")): protein = load_surface_np(p, center=False) np.save(npy_dir / (p.stem + "_xyz.npy"), protein["xyz"]) np.save(npy_dir / (p.stem + "_triangles.npy"), protein["triangles"]) np.save(npy_dir / (p.stem + "_features.npy"), protein["features"]) np.save(npy_dir / (p.stem + "_iface_labels.npy"), protein["iface_labels"]) np.save(npy_dir / (p.stem + "_normals.npy"), protein["normals"]) ================================================ FILE: data_preprocessing/download_pdb.py ================================================ import Bio from Bio.PDB import * from Bio.SeqUtils import IUPACData import sys import importlib import os import numpy as np from subprocess import Popen, PIPE from pathlib import Path from convert_pdb2npy import load_structure_np import argparse parser = argparse.ArgumentParser(description="Arguments") parser.add_argument( "--pdb", type=str,default='', help="PDB code along with chains to extract, example 1ABC_A_B", required=False ) parser.add_argument( "--pdb_list", type=str,default='', help="Path to a text file that includes a list of PDB codes along with chains, example 1ABC_A_B", required=False ) tmp_dir = Path('./tmp') pdb_dir = Path('./pdbs') npy_dir = Path('./npys') PROTEIN_LETTERS = [x.upper() for x in IUPACData.protein_letters_3to1.keys()] # Exclude disordered atoms. class NotDisordered(Select): def accept_atom(self, atom): return not atom.is_disordered() or atom.get_altloc() == "A" or atom.get_altloc() == "1" def find_modified_amino_acids(path): """ Contributed by github user jomimc - find modified amino acids in the PDB (e.g. MSE) """ res_set = set() for line in open(path, 'r'): if line[:6] == 'SEQRES': for res in line.split()[4:]: res_set.add(res) for res in list(res_set): if res in PROTEIN_LETTERS: res_set.remove(res) return res_set def extractPDB( infilename, outfilename, chain_ids=None ): # extract the chain_ids from infilename and save in outfilename. parser = PDBParser(QUIET=True) struct = parser.get_structure(infilename, infilename) model = Selection.unfold_entities(struct, "M")[0] chains = Selection.unfold_entities(struct, "C") # Select residues to extract and build new structure structBuild = StructureBuilder.StructureBuilder() structBuild.init_structure("output") structBuild.init_seg(" ") structBuild.init_model(0) outputStruct = structBuild.get_structure() # Load a list of non-standard amino acid names -- these are # typically listed under HETATM, so they would be typically # ignored by the orginal algorithm modified_amino_acids = find_modified_amino_acids(infilename) for chain in model: if ( chain_ids == None or chain.get_id() in chain_ids ): structBuild.init_chain(chain.get_id()) for residue in chain: het = residue.get_id() if het[0] == " ": outputStruct[0][chain.get_id()].add(residue) elif het[0][-3:] in modified_amino_acids: outputStruct[0][chain.get_id()].add(residue) # Output the selected residues pdbio = PDBIO() pdbio.set_structure(outputStruct) pdbio.save(outfilename, select=NotDisordered()) def protonate(in_pdb_file, out_pdb_file): # protonate (i.e., add hydrogens) a pdb using reduce and save to an output file. # in_pdb_file: file to protonate. # out_pdb_file: output file where to save the protonated pdb file. # Remove protons first, in case the structure is already protonated args = ["reduce", "-Trim", in_pdb_file] p2 = Popen(args, stdout=PIPE, stderr=PIPE) stdout, stderr = p2.communicate() outfile = open(out_pdb_file, "w") outfile.write(stdout.decode('utf-8').rstrip()) outfile.close() # Now add them again. args = ["reduce", "-HIS", out_pdb_file] p2 = Popen(args, stdout=PIPE, stderr=PIPE) stdout, stderr = p2.communicate() outfile = open(out_pdb_file, "w") outfile.write(stdout.decode('utf-8')) outfile.close() def get_single(pdb_id: str,chains: list): protonated_file = pdb_dir/f"{pdb_id}.pdb" if not protonated_file.exists(): # Download pdb pdbl = PDBList() pdb_filename = pdbl.retrieve_pdb_file(pdb_id, pdir=tmp_dir,file_format='pdb') ##### Protonate with reduce, if hydrogens included. # - Always protonate as this is useful for charges. If necessary ignore hydrogens later. protonate(pdb_filename, protonated_file) pdb_filename = protonated_file # Extract chains of interest. for chain in chains: out_filename = pdb_dir/f"{pdb_id}_{chain}.pdb" extractPDB(pdb_filename, str(out_filename), chain) protein = load_structure_np(out_filename,center=False) np.save(npy_dir / f"{pdb_id}_{chain}_atomxyz", protein["xyz"]) np.save(npy_dir / f"{pdb_id}_{chain}_atomtypes", protein["types"]) if __name__ == '__main__': args = parser.parse_args() if args.pdb != '': pdb_id = args.pdb.split('_') chains = pdb_id[1:] pdb_id = pdb_id[0] get_single(pdb_id,chains) elif args.pdb_list != '': with open(args.pdb_list) as f: pdb_list = f.read().splitlines() for pdb_id in pdb_list: pdb_id = pdb_id.split('_') chains = pdb_id[1:] pdb_id = pdb_id[0] get_single(pdb_id,chains) else: raise ValueError('Must specify PDB or PDB list') ================================================ FILE: geometry_processing.py ================================================ import numpy as np from math import pi import torch from pykeops.torch import LazyTensor from plyfile import PlyData, PlyElement from helper import * import torch.nn as nn import torch.nn.functional as F # from matplotlib import pyplot as plt from pykeops.torch.cluster import grid_cluster, cluster_ranges_centroids, from_matrix from math import pi, sqrt # Input-Output for tests ======================================================= import os from pyvtk import PolyData, PointData, CellData, Scalars, Vectors, VtkData, PointData def save_vtk( fname, xyz, triangles=None, values=None, vectors=None, triangle_values=None ): """Saves a point cloud or triangle mesh as a .vtk file. Files can be opened with Paraview or displayed using the PyVista library. Args: fname (string): filename. xyz (Tensor): (N,3) point cloud or vertices. triangles (integer Tensor, optional): (T,3) mesh connectivity. Defaults to None. values (Tensor, optional): (N,D) values, supported by the vertices. Defaults to None. vectors (Tensor, optional): (N,3) vectors, supported by the vertices. Defaults to None. triangle_values (Tensor, optional): (T,D) values, supported by the triangles. Defaults to None. """ # Encode the points/vertices as a VTK structure: if triangles is None: # Point cloud structure = PolyData(points=numpy(xyz), vertices=np.arange(len(xyz))) else: # Surface mesh structure = PolyData(points=numpy(xyz), polygons=numpy(triangles)) data = [structure] pointdata, celldata = [], [] # Point values - one channel per column of the `values` array: if values is not None: values = numpy(values) if len(values.shape) == 1: values = values[:, None] features = values.T pointdata += [ Scalars(f, name=f"features_{i:02d}") for i, f in enumerate(features) ] # Point vectors - one vector per point: if vectors is not None: pointdata += [Vectors(numpy(vectors), name="vectors")] # Store in the VTK object: if pointdata != []: pointdata = PointData(*pointdata) data.append(pointdata) # Triangle values - one channel per column of the `triangle_values` array: if triangle_values is not None: triangle_values = numpy(triangle_values) if len(triangle_values.shape) == 1: triangle_values = triangle_values[:, None] features = triangle_values.T celldata += [ Scalars(f, name=f"features_{i:02d}") for i, f in enumerate(features) ] celldata = CellData(*celldata) data.append(celldata) #  Write to hard drive: vtk = VtkData(*data) os.makedirs(os.path.dirname(fname), exist_ok=True) vtk.tofile(fname) # On-the-fly generation of the surfaces ======================================== def subsample(x, batch=None, scale=1.0): """Subsamples the point cloud using a grid (cubic) clustering scheme. The function returns one average sample per cell, as described in Fig. 3.e) of the paper. Args: x (Tensor): (N,3) point cloud. batch (integer Tensor, optional): (N,) batch vector, as in PyTorch_geometric. Defaults to None. scale (float, optional): side length of the cubic grid cells. Defaults to 1 (Angstrom). Returns: (M,3): sub-sampled point cloud, with M <= N. """ if batch is None: # Single protein case: if True: # Use a fast scatter_add_ implementation labels = grid_cluster(x, scale).long() C = labels.max() + 1 # We append a "1" to the input vectors, in order to # compute both the numerator and denominator of the "average" #  fraction in one pass through the data. x_1 = torch.cat((x, torch.ones_like(x[:, :1])), dim=1) D = x_1.shape[1] points = torch.zeros_like(x_1[:C]) points.scatter_add_(0, labels[:, None].repeat(1, D), x_1) return (points[:, :-1] / points[:, -1:]).contiguous() else: # Older implementation; points = scatter(points * weights[:, None], labels, dim=0) weights = scatter(weights, labels, dim=0) points = points / weights[:, None] else: # We process proteins using a for loop. # This is probably sub-optimal, but I don't really know # how to do more elegantly (this type of computation is # not super well supported by PyTorch). batch_size = torch.max(batch).item() + 1 # Typically, =32 points, batches = [], [] for b in range(batch_size): p = subsample(x[batch == b], scale=scale) points.append(p) batches.append(b * torch.ones_like(batch[: len(p)])) return torch.cat(points, dim=0), torch.cat(batches, dim=0) def soft_distances(x, y, batch_x, batch_y, smoothness=0.01, atomtypes=None): """Computes a soft distance function to the atom centers of a protein. Implements Eq. (1) of the paper in a fast and numerically stable way. Args: x (Tensor): (N,3) atom centers. y (Tensor): (M,3) sampling locations. batch_x (integer Tensor): (N,) batch vector for x, as in PyTorch_geometric. batch_y (integer Tensor): (M,) batch vector for y, as in PyTorch_geometric. smoothness (float, optional): atom radii if atom types are not provided. Defaults to .01. atomtypes (integer Tensor, optional): (N,6) one-hot encoding of the atom chemical types. Defaults to None. Returns: Tensor: (M,) values of the soft distance function on the points `y`. """ # Build the (N, M, 1) symbolic matrix of squared distances: x_i = LazyTensor(x[:, None, :]) # (N, 1, 3) atoms y_j = LazyTensor(y[None, :, :]) # (1, M, 3) sampling points D_ij = ((x_i - y_j) ** 2).sum(-1) # (N, M, 1) squared distances # Use a block-diagonal sparsity mask to support heterogeneous batch processing: D_ij.ranges = diagonal_ranges(batch_x, batch_y) if atomtypes is not None: # Turn the one-hot encoding "atomtypes" into a vector of diameters "smoothness_i": # (N, 6) -> (N, 1, 1) (There are 6 atom types) atomic_radii = torch.cuda.FloatTensor( [170, 110, 152, 155, 180, 190], device=x.device ) atomic_radii = atomic_radii / atomic_radii.min() atomtype_radii = atomtypes * atomic_radii[None, :] # n_atoms, n_atomtypes # smoothness = atomtypes @ atomic_radii # (N, 6) @ (6,) = (N,) smoothness = torch.sum( smoothness * atomtype_radii, dim=1, keepdim=False ) # n_atoms, 1 smoothness_i = LazyTensor(smoothness[:, None, None]) # Compute an estimation of the mean smoothness in a neighborhood # of each sampling point: # density = (-D_ij.sqrt()).exp().sum(0).view(-1) # (M,) local density of atoms # smooth = (smoothness_i * (-D_ij.sqrt()).exp()).sum(0).view(-1) # (M,) # mean_smoothness = smooth / density # (M,) # soft_dists = -mean_smoothness * ( # (-D_ij.sqrt() / smoothness_i).logsumexp(dim=0) # ).view(-1) mean_smoothness = (-D_ij.sqrt()).exp().sum(0) mean_smoothness_j = LazyTensor(mean_smoothness[None, :, :]) mean_smoothness = ( smoothness_i * (-D_ij.sqrt()).exp() / mean_smoothness_j ) # n_atoms, n_points, 1 mean_smoothness = mean_smoothness.sum(0).view(-1) soft_dists = -mean_smoothness * ( (-D_ij.sqrt() / smoothness_i).logsumexp(dim=0) ).view(-1) else: soft_dists = -smoothness * ((-D_ij.sqrt() / smoothness).logsumexp(dim=0)).view( -1 ) return soft_dists def atoms_to_points_normals( atoms, batch, distance=1.05, smoothness=0.5, resolution=1.0, nits=4, atomtypes=None, sup_sampling=20, variance=0.1, ): """Turns a collection of atoms into an oriented point cloud. Sampling algorithm for protein surfaces, described in Fig. 3 of the paper. Args: atoms (Tensor): (N,3) coordinates of the atom centers `a_k`. batch (integer Tensor): (N,) batch vector, as in PyTorch_geometric. distance (float, optional): value of the level set to sample from the smooth distance function. Defaults to 1.05. smoothness (float, optional): radii of the atoms, if atom types are not provided. Defaults to 0.5. resolution (float, optional): side length of the cubic cells in the final sub-sampling pass. Defaults to 1.0. nits (int, optional): number of iterations . Defaults to 4. atomtypes (Tensor, optional): (N,6) one-hot encoding of the atom chemical types. Defaults to None. Returns: (Tensor): (M,3) coordinates for the surface points `x_i`. (Tensor): (M,3) unit normals `n_i`. (integer Tensor): (M,) batch vector, as in PyTorch_geometric. """ # a) Parameters for the soft distance function and its level set: T = distance N, D = atoms.shape B = sup_sampling # Sup-sampling ratio # Batch vectors: batch_atoms = batch batch_z = batch[:, None].repeat(1, B).view(N * B) # b) Draw N*B points at random in the neighborhood of our atoms z = atoms[:, None, :] + 10 * T * torch.randn(N, B, D).type_as(atoms) z = z.view(-1, D) # (N*B, D) # We don't want to backprop through a full network here! atoms = atoms.detach().contiguous() z = z.detach().contiguous() # N.B.: Test mode disables the autograd engine: we must switch it on explicitely. with torch.enable_grad(): if z.is_leaf: z.requires_grad = True # c) Iterative loop: gradient descent along the potential # ".5 * (dist - T)^2" with respect to the positions z of our samples for it in range(nits): dists = soft_distances( atoms, z, batch_atoms, batch_z, smoothness=smoothness, atomtypes=atomtypes, ) Loss = ((dists - T) ** 2).sum() g = torch.autograd.grad(Loss, z)[0] z.data -= 0.5 * g # d) Only keep the points which are reasonably close to the level set: dists = soft_distances( atoms, z, batch_atoms, batch_z, smoothness=smoothness, atomtypes=atomtypes ) margin = (dists - T).abs() mask = margin < variance * T # d') And remove the points that are trapped *inside* the protein: zz = z.detach() zz.requires_grad = True for it in range(nits): dists = soft_distances( atoms, zz, batch_atoms, batch_z, smoothness=smoothness, atomtypes=atomtypes, ) Loss = (1.0 * dists).sum() g = torch.autograd.grad(Loss, zz)[0] normals = F.normalize(g, p=2, dim=-1) # (N, 3) zz = zz + 1.0 * T * normals dists = soft_distances( atoms, zz, batch_atoms, batch_z, smoothness=smoothness, atomtypes=atomtypes ) mask = mask & (dists > 1.5 * T) z = z[mask].contiguous().detach() batch_z = batch_z[mask].contiguous().detach() # e) Subsample the point cloud: points, batch_points = subsample(z, batch_z, scale=resolution) # f) Compute the normals on this smaller point cloud: p = points.detach() p.requires_grad = True dists = soft_distances( atoms, p, batch_atoms, batch_points, smoothness=smoothness, atomtypes=atomtypes, ) Loss = (1.0 * dists).sum() g = torch.autograd.grad(Loss, p)[0] normals = F.normalize(g, p=2, dim=-1) # (N, 3) points = points - 0.5 * normals return points.detach(), normals.detach(), batch_points.detach() # Surface mesh -> Normals ====================================================== def mesh_normals_areas(vertices, triangles=None, scale=[1.0], batch=None, normals=None): """Returns a smooth field of normals, possibly at different scales. points, triangles or normals, scale(s) -> normals (N, 3), (3, T) or (N,3), (S,) -> (N, 3) or (N, S, 3) Simply put - if `triangles` are provided: 1. Normals are first computed for every triangle using simple 3D geometry and are weighted according to surface area. 2. The normal at any given vertex is then computed as the weighted average of the normals of all triangles in a neighborhood specified by Gaussian windows whose radii are given in the list of "scales". If `normals` are provided instead, we simply smooth the discrete vector field using Gaussian windows whose radii are given in the list of "scales". If more than one scale is provided, normal fields are computed in parallel and returned in a single 3D tensor. Args: vertices (Tensor): (N,3) coordinates of mesh vertices or 3D points. triangles (integer Tensor, optional): (3,T) mesh connectivity. Defaults to None. scale (list of floats, optional): (S,) radii of the Gaussian smoothing windows. Defaults to [1.]. batch (integer Tensor, optional): batch vector, as in PyTorch_geometric. Defaults to None. normals (Tensor, optional): (N,3) raw normals vectors on the vertices. Defaults to None. Returns: (Tensor): (N,3) or (N,S,3) point normals. (Tensor): (N,) point areas, if triangles were provided. """ # Single- or Multi-scale mode: if hasattr(scale, "__len__"): scales, single_scale = scale, False else: scales, single_scale = [scale], True scales = torch.Tensor(scales).type_as(vertices) # (S,) # Compute the "raw" field of normals: if triangles is not None: # Vertices of all triangles in the mesh: A = vertices[triangles[0, :]] # (N, 3) B = vertices[triangles[1, :]] # (N, 3) C = vertices[triangles[2, :]] # (N, 3) # Triangle centers and normals (length = surface area): centers = (A + B + C) / 3 # (N, 3) V = (B - A).cross(C - A) # (N, 3) # Vertice areas: S = (V ** 2).sum(-1).sqrt() / 6 # (N,) 1/3 of a triangle area areas = torch.zeros(len(vertices)).type_as(vertices) # (N,) areas.scatter_add_(0, triangles[0, :], S) # Aggregate from "A's" areas.scatter_add_(0, triangles[1, :], S) # Aggregate from "B's" areas.scatter_add_(0, triangles[2, :], S) # Aggregate from "C's" else: # Use "normals" instead areas = None V = normals centers = vertices # Normal of a vertex = average of all normals in a ball of size "scale": x_i = LazyTensor(vertices[:, None, :]) # (N, 1, 3) y_j = LazyTensor(centers[None, :, :]) # (1, M, 3) v_j = LazyTensor(V[None, :, :]) # (1, M, 3) s = LazyTensor(scales[None, None, :]) # (1, 1, S) D_ij = ((x_i - y_j) ** 2).sum(-1) #  (N, M, 1) K_ij = (-D_ij / (2 * s ** 2)).exp() # (N, M, S) # Support for heterogeneous batch processing: if batch is not None: batch_vertices = batch batch_centers = batch[triangles[0, :]] if triangles is not None else batch K_ij.ranges = diagonal_ranges(batch_vertices, batch_centers) if single_scale: U = (K_ij * v_j).sum(dim=1) # (N, 3) else: U = (K_ij.tensorprod(v_j)).sum(dim=1) # (N, S*3) U = U.view(-1, len(scales), 3) # (N, S, 3) normals = F.normalize(U, p=2, dim=-1) # (N, 3) or (N, S, 3) return normals, areas # Compute tangent planes and curvatures ======================================== def tangent_vectors(normals): """Returns a pair of vector fields u and v to complete the orthonormal basis [n,u,v]. normals -> uv (N, 3) or (N, S, 3) -> (N, 2, 3) or (N, S, 2, 3) This routine assumes that the 3D "normal" vectors are normalized. It is based on the 2017 paper from Pixar, "Building an orthonormal basis, revisited". Args: normals (Tensor): (N,3) or (N,S,3) normals `n_i`, i.e. unit-norm 3D vectors. Returns: (Tensor): (N,2,3) or (N,S,2,3) unit vectors `u_i` and `v_i` to complete the tangent coordinate systems `[n_i,u_i,v_i]. """ x, y, z = normals[..., 0], normals[..., 1], normals[..., 2] s = (2 * (z >= 0)) - 1.0 # = z.sign(), but =1. if z=0. a = -1 / (s + z) b = x * y * a uv = torch.stack((1 + s * x * x * a, s * b, -s * x, b, s + y * y * a, -y), dim=-1) uv = uv.view(uv.shape[:-1] + (2, 3)) return uv def curvatures( vertices, triangles=None, scales=[1.0], batch=None, normals=None, reg=0.01 ): """Returns a collection of mean (H) and Gauss (K) curvatures at different scales. points, faces, scales -> (H_1, K_1, ..., H_S, K_S) (N, 3), (3, N), (S,) -> (N, S*2) We rely on a very simple linear regression method, for all vertices: 1. Estimate normals and surface areas. 2. Compute a local tangent frame. 3. In a pseudo-geodesic Gaussian neighborhood at scale s, compute the two (2, 2) covariance matrices PPt and PQt between the displacement vectors "P = x_i - x_j" and the normals "Q = n_i - n_j", projected on the local tangent plane. 4. Up to the sign, the shape operator S at scale s is then approximated as "S = (reg**2 * I_2 + PPt)^-1 @ PQt". 5. The mean and Gauss curvatures are the trace and determinant of this (2, 2) matrix. As of today, this implementation does not weigh points by surface areas: this could make a sizeable difference if protein surfaces were not sub-sampled to ensure uniform sampling density. For convergence analysis, see for instance "Efficient curvature estimation for oriented point clouds", Cao, Li, Sun, Assadi, Zhang, 2019. Args: vertices (Tensor): (N,3) coordinates of the points or mesh vertices. triangles (integer Tensor, optional): (3,T) mesh connectivity. Defaults to None. scales (list of floats, optional): list of (S,) smoothing scales. Defaults to [1.]. batch (integer Tensor, optional): batch vector, as in PyTorch_geometric. Defaults to None. normals (Tensor, optional): (N,3) field of "raw" unit normals. Defaults to None. reg (float, optional): small amount of Tikhonov/ridge regularization in the estimation of the shape operator. Defaults to .01. Returns: (Tensor): (N, S*2) tensor of mean and Gauss curvatures computed for every point at the required scales. """ # Number of points, number of scales: N, S = vertices.shape[0], len(scales) ranges = diagonal_ranges(batch) # Compute the normals at different scales + vertice areas: normals_s, _ = mesh_normals_areas( vertices, triangles=triangles, normals=normals, scale=scales, batch=batch ) # (N, S, 3), (N,) # Local tangent bases: uv_s = tangent_vectors(normals_s) # (N, S, 2, 3) features = [] for s, scale in enumerate(scales): # Extract the relevant descriptors at the current scale: normals = normals_s[:, s, :].contiguous() #  (N, 3) uv = uv_s[:, s, :, :].contiguous() # (N, 2, 3) # Encode as symbolic tensors: # Points: x_i = LazyTensor(vertices.view(N, 1, 3)) x_j = LazyTensor(vertices.view(1, N, 3)) # Normals: n_i = LazyTensor(normals.view(N, 1, 3)) n_j = LazyTensor(normals.view(1, N, 3)) # Tangent bases: uv_i = LazyTensor(uv.view(N, 1, 6)) # Pseudo-geodesic squared distance: d2_ij = ((x_j - x_i) ** 2).sum(-1) * ((2 - (n_i | n_j)) ** 2) # (N, N, 1) # Gaussian window: window_ij = (-d2_ij / (2 * (scale ** 2))).exp() # (N, N, 1) # Project on the tangent plane: P_ij = uv_i.matvecmult(x_j - x_i) # (N, N, 2) Q_ij = uv_i.matvecmult(n_j - n_i) # (N, N, 2) # Concatenate: PQ_ij = P_ij.concat(Q_ij) # (N, N, 2+2) # Covariances, with a scale-dependent weight: PPt_PQt_ij = P_ij.tensorprod(PQ_ij) # (N, N, 2*(2+2)) PPt_PQt_ij = window_ij * PPt_PQt_ij #  (N, N, 2*(2+2)) # Reduction - with batch support: PPt_PQt_ij.ranges = ranges PPt_PQt = PPt_PQt_ij.sum(1) # (N, 2*(2+2)) # Reshape to get the two covariance matrices: PPt_PQt = PPt_PQt.view(N, 2, 2, 2) PPt, PQt = PPt_PQt[:, :, 0, :], PPt_PQt[:, :, 1, :] # (N, 2, 2), (N, 2, 2) # Add a small ridge regression: PPt[:, 0, 0] += reg PPt[:, 1, 1] += reg # (minus) Shape operator, i.e. the differential of the Gauss map: # = (PPt^-1 @ PQt) : simple estimation through linear regression S = torch.solve(PQt, PPt).solution a, b, c, d = S[:, 0, 0], S[:, 0, 1], S[:, 1, 0], S[:, 1, 1] # (N,) # Normalization mean_curvature = a + d gauss_curvature = a * d - b * c features += [mean_curvature.clamp(-1, 1), gauss_curvature.clamp(-1, 1)] features = torch.stack(features, dim=-1) return features #  Fast tangent convolution layer =============================================== class ContiguousBackward(torch.autograd.Function): """ Function to ensure contiguous gradient in backward pass. To be applied after PyKeOps reduction. N.B.: This workaround fixes a bug that will be fixed in ulterior KeOp releases. """ @staticmethod def forward(ctx, input): return input @staticmethod def backward(ctx, grad_output): return grad_output.contiguous() class dMaSIFConv(nn.Module): def __init__( self, in_channels=1, out_channels=1, radius=1.0, hidden_units=None, cheap=False ): """Creates the KeOps convolution layer. I = in_channels is the dimension of the input features O = out_channels is the dimension of the output features H = hidden_units is the dimension of the intermediate representation radius is the size of the pseudo-geodesic Gaussian window w_ij = W(d_ij) This affordable layer implements an elementary "convolution" operator on a cloud of N points (x_i) in dimension 3 that we decompose in three steps: 1. Apply the MLP "net_in" on the input features "f_i". (N, I) -> (N, H) 2. Compute H interaction terms in parallel with: f_i = sum_j [ w_ij * conv(P_ij) * f_j ] In the equation above: - w_ij is a pseudo-geodesic window with a set radius. - P_ij is a vector of dimension 3, equal to "x_j-x_i" in the local oriented basis at x_i. - "conv" is an MLP from R^3 to R^H: - with 1 linear layer if "cheap" is True; - with 2 linear layers and C=8 intermediate "cuts" otherwise. - "*" is coordinate-wise product. - f_j is the vector of transformed features. 3. Apply the MLP "net_out" on the output features. (N, H) -> (N, O) A more general layer would have implemented conv(P_ij) as a full (H, H) matrix instead of a mere (H,) vector... At a much higher computational cost. The reasoning behind the code below is that a given time budget is better spent on using a larger architecture and more channels than on a very complex convolution operator. Interactions between channels happen at steps 1. and 3., whereas the (costly) point-to-point interaction step 2. lets the network aggregate information in spatial neighborhoods. Args: in_channels (int, optional): numper of input features per point. Defaults to 1. out_channels (int, optional): number of output features per point. Defaults to 1. radius (float, optional): deviation of the Gaussian window on the quasi-geodesic distance `d_ij`. Defaults to 1.. hidden_units (int, optional): number of hidden features per point. Defaults to out_channels. cheap (bool, optional): shall we use a 1-layer deep Filter, instead of a 2-layer deep MLP? Defaults to False. """ super(dMaSIFConv, self).__init__() self.Input = in_channels self.Output = out_channels self.Radius = radius self.Hidden = self.Output if hidden_units is None else hidden_units self.Cuts = 8 # Number of hidden units for the 3D MLP Filter. self.cheap = cheap # For performance reasons, we cut our "hidden" vectors # in n_heads "independent heads" of dimension 8. self.heads_dim = 8 # 4 is probably too small; 16 is certainly too big # We accept "Hidden" dimensions of size 1, 2, 3, 4, 5, 6, 7, 8, 16, 32, 64, ... if self.Hidden < self.heads_dim: self.heads_dim = self.Hidden if self.Hidden % self.heads_dim != 0: raise ValueError(f"The dimension of the hidden units ({self.Hidden})"\ + f"should be a multiple of the heads dimension ({self.heads_dim}).") else: self.n_heads = self.Hidden // self.heads_dim # Transformation of the input features: self.net_in = nn.Sequential( nn.Linear(self.Input, self.Hidden), # (H, I) + (H,) nn.LeakyReLU(negative_slope=0.2), nn.Linear(self.Hidden, self.Hidden), # (H, H) + (H,) # nn.LayerNorm(self.Hidden),#nn.BatchNorm1d(self.Hidden), nn.LeakyReLU(negative_slope=0.2), ) #  (H,) self.norm_in = nn.GroupNorm(4, self.Hidden) # self.norm_in = nn.LayerNorm(self.Hidden) # self.norm_in = nn.Identity() # 3D convolution filters, encoded as an MLP: if cheap: self.conv = nn.Sequential( nn.Linear(3, self.Hidden), nn.ReLU() # (H, 3) + (H,) ) # KeOps does not support well LeakyReLu else: self.conv = nn.Sequential( nn.Linear(3, self.Cuts), # (C, 3) + (C,) nn.ReLU(), # KeOps does not support well LeakyReLu nn.Linear(self.Cuts, self.Hidden), ) # (H, C) + (H,) # Transformation of the output features: self.net_out = nn.Sequential( nn.Linear(self.Hidden, self.Output), # (O, H) + (O,) nn.LeakyReLU(negative_slope=0.2), nn.Linear(self.Output, self.Output), # (O, O) + (O,) # nn.LayerNorm(self.Output),#nn.BatchNorm1d(self.Output), nn.LeakyReLU(negative_slope=0.2), ) #  (O,) self.norm_out = nn.GroupNorm(4, self.Output) # self.norm_out = nn.LayerNorm(self.Output) # self.norm_out = nn.Identity() # Custom initialization for the MLP convolution filters: # we get interesting piecewise affine cuts on a normalized neighborhood. with torch.no_grad(): nn.init.normal_(self.conv[0].weight) nn.init.uniform_(self.conv[0].bias) self.conv[0].bias *= 0.8 * (self.conv[0].weight ** 2).sum(-1).sqrt() if not cheap: nn.init.uniform_( self.conv[2].weight, a=-1 / np.sqrt(self.Cuts), b=1 / np.sqrt(self.Cuts), ) nn.init.normal_(self.conv[2].bias) self.conv[2].bias *= 0.5 * (self.conv[2].weight ** 2).sum(-1).sqrt() def forward(self, points, nuv, features, ranges=None): """Performs a quasi-geodesic interaction step. points, local basis, in features -> out features (N, 3), (N, 3, 3), (N, I) -> (N, O) This layer computes the interaction step of Eq. (7) in the paper, in-between the application of two MLP networks independently on all feature vectors. Args: points (Tensor): (N,3) point coordinates `x_i`. nuv (Tensor): (N,3,3) local coordinate systems `[n_i,u_i,v_i]`. features (Tensor): (N,I) input feature vectors `f_i`. ranges (6-uple of integer Tensors, optional): low-level format to support batch processing, as described in the KeOps documentation. In practice, this will be built by a higher-level object to encode the relevant "batch vectors" in a way that is convenient for the KeOps CUDA engine. Defaults to None. Returns: (Tensor): (N,O) output feature vectors `f'_i`. """ # 1. Transform the input features: ------------------------------------- features = self.net_in(features) # (N, I) -> (N, H) features = features.transpose(1, 0)[None, :, :] # (1,H,N) features = self.norm_in(features) features = features[0].transpose(1, 0).contiguous() # (1, H, N) -> (N, H) # 2. Compute the local "shape contexts": ------------------------------- # 2.a Normalize the kernel radius: points = points / (sqrt(2.0) * self.Radius) # (N, 3) # 2.b Encode the variables as KeOps LazyTensors # Vertices: x_i = LazyTensor(points[:, None, :]) # (N, 1, 3) x_j = LazyTensor(points[None, :, :]) # (1, N, 3) # WARNING - Here, we assume that the normals are fixed: normals = ( nuv[:, 0, :].contiguous().detach() ) # (N, 3) - remove the .detach() if needed # Local bases: nuv_i = LazyTensor(nuv.view(-1, 1, 9)) # (N, 1, 9) # Normals: n_i = nuv_i[:3] # (N, 1, 3) n_j = LazyTensor(normals[None, :, :]) # (1, N, 3) # To avoid register spilling when using large embeddings, we perform our KeOps reduction # over the vector of length "self.Hidden = self.n_heads * self.heads_dim" # as self.n_heads reduction over vectors of length self.heads_dim (= "Hd" in the comments). head_out_features = [] for head in range(self.n_heads): # Extract a slice of width Hd from the feature array head_start = head * self.heads_dim head_end = head_start + self.heads_dim head_features = features[:, head_start:head_end].contiguous() # (N, H) -> (N, Hd) # Features: f_j = LazyTensor(head_features[None, :, :]) # (1, N, Hd) # Convolution parameters: if self.cheap: # Extract a slice of Hd lines: (H, 3) -> (Hd, 3) A = self.conv[0].weight[head_start:head_end, :].contiguous() # Extract a slice of Hd coefficients: (H,) -> (Hd,) B = self.conv[0].bias[head_start:head_end].contiguous() AB = torch.cat((A, B[:, None]), dim=1) # (Hd, 4) ab = LazyTensor(AB.view(1, 1, -1)) # (1, 1, Hd*4) else: A_1, B_1 = self.conv[0].weight, self.conv[0].bias # (C, 3), (C,) # Extract a slice of Hd lines: (H, C) -> (Hd, C) A_2 = self.conv[2].weight[head_start:head_end, :].contiguous() # Extract a slice of Hd coefficients: (H,) -> (Hd,) B_2 = self.conv[2].bias[head_start:head_end].contiguous() a_1 = LazyTensor(A_1.view(1, 1, -1)) # (1, 1, C*3) b_1 = LazyTensor(B_1.view(1, 1, -1)) # (1, 1, C) a_2 = LazyTensor(A_2.view(1, 1, -1)) # (1, 1, Hd*C) b_2 = LazyTensor(B_2.view(1, 1, -1)) # (1, 1, Hd) # 2.c Pseudo-geodesic window: # Pseudo-geodesic squared distance: d2_ij = ((x_j - x_i) ** 2).sum(-1) * ((2 - (n_i | n_j)) ** 2) # (N, N, 1) # Gaussian window: window_ij = (-d2_ij).exp() # (N, N, 1) # 2.d Local MLP: # Local coordinates: X_ij = nuv_i.matvecmult(x_j - x_i) # (N, N, 9) "@" (N, N, 3) = (N, N, 3) # MLP: if self.cheap: X_ij = ab.matvecmult( X_ij.concat(LazyTensor(1)) ) # (N, N, Hd*4) @ (N, N, 3+1) = (N, N, Hd) X_ij = X_ij.relu() # (N, N, Hd) else: X_ij = a_1.matvecmult(X_ij) + b_1 # (N, N, C) X_ij = X_ij.relu() # (N, N, C) X_ij = a_2.matvecmult(X_ij) + b_2 # (N, N, Hd) X_ij = X_ij.relu() # 2.e Actual computation: F_ij = window_ij * X_ij * f_j # (N, N, Hd) F_ij.ranges = ranges # Support for batches and/or block-sparsity head_out_features.append(ContiguousBackward().apply(F_ij.sum(dim=1))) # (N, Hd) # Concatenate the result of our n_heads "attention heads": features = torch.cat(head_out_features, dim=1) # n_heads * (N, Hd) -> (N, H) # 3. Transform the output features: ------------------------------------ features = self.net_out(features) # (N, H) -> (N, O) features = features.transpose(1, 0)[None, :, :] # (1,O,N) features = self.norm_out(features) features = features[0].transpose(1, 0).contiguous() return features ================================================ FILE: helper.py ================================================ import colorsys import numpy as np import torch from pykeops.torch import LazyTensor from plyfile import PlyData, PlyElement from pathlib import Path tensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor inttensor = torch.cuda.LongTensor if torch.cuda.is_available() else torch.LongTensor numpy = lambda x: x.detach().cpu().numpy() def ranges_slices(batch): """Helper function for the diagonal ranges function.""" Ns = batch.bincount() indices = Ns.cumsum(0) ranges = torch.cat((0 * indices[:1], indices)) ranges = ( torch.stack((ranges[:-1], ranges[1:])).t().int().contiguous().to(batch.device) ) slices = (1 + torch.arange(len(Ns))).int().to(batch.device) return ranges, slices def diagonal_ranges(batch_x=None, batch_y=None): """Encodes the block-diagonal structure associated to a batch vector.""" if batch_x is None and batch_y is None: return None # No batch processing elif batch_y is None: batch_y = batch_x # "symmetric" case ranges_x, slices_x = ranges_slices(batch_x) ranges_y, slices_y = ranges_slices(batch_y) return ranges_x, slices_x, ranges_y, ranges_y, slices_y, ranges_x def soft_dimension(features): """Continuous approximation of the rank of a (N, D) sample. Let "s" denote the (D,) vector of eigenvalues of Cov, the (D, D) covariance matrix of the sample "features". Then, R(features) = \sum_i sqrt(s_i) / \max_i sqrt(s_i) This quantity encodes the number of PCA components that would be required to describe the sample with a good precision. It is equal to D if the sample is isotropic, but is generally much lower. Up to the re-normalization by the largest eigenvalue, this continuous pseudo-rank is equal to the nuclear norm of the sample. """ nfeat = features.shape[-1] features = features.view(-1, nfeat) x = features - torch.mean(features, dim=0, keepdim=True) cov = x.T @ x try: u, s, v = torch.svd(cov) R = s.sqrt().sum() / s.sqrt().max() except: return -1 return R.item() ================================================ FILE: lists/testing.txt ================================================ 1A99_D 1AUI_A 1BO6_A 1BOU_B 1BPL_B 1C7N_D 1CS0_B 1DM5_F 1DOS_B 1EFV_A 1EHI_A 1EV7_A 1EWY_A 1EZ1_B 1F06_A 1F6M_A 1FFV_C 1FR8_A 1FT8_C 1FZW_B 1GP2_BG 1GX7_A 1H6D_A 1HF2_C 1I2M_B 1IUG_A 1IXS_B 1IZ1_B 1J0E_B 1JG8_D 1JR3_D 1JTD_B 1K3R_B 1KIZ_B 1KYQ_B 1LEH_B 1M1T_B 1M32_D 1MB2_F 1NCA_N 1ND6_B 1O4U_B 1O57_D 1O61_A 1OJ7_D 1OMZ_B 1ONW_B 1P6X_A 1P9E_A 1PK8_A 1POI_A 1R0K_D 1R8J_A 1RQD_A 1RYI_C 1SOJ_J 1ST0_A 1SUW_D 1SXJ_D 1SXJ_E 1SZ2_B 1T8U_B 1TO6_A 1U0R_C 1U2V_C 1U6S_A 1UL1_X 1V7C_A 1VHK_C 1W1W_B 1W23_A 1WDW_H 1WKH_B 1WKV_B 1WPP_B 1WX1_B 1X7O_A 1X9J_G 1XF9_A 1XG2_A 1XI8_A 1XQS_A 1XXI_C 1XXI_E 1Y56_B 1Y8Q_A 1YKJ_A 1Z85_B 1ZCT_B 1ZH8_A 1ZHH_A 1ZXO_C 2AF4_C 2AUN_A 2AW6_A 2AYO_A 2B3Z_D 2BP7_B 2BWN_E 2C0L_A 2CDB_A 2CE8_A 2CH5_A 2CVO_B 2DG0_E 2E2P_A 2E5F_A 2E7J_B 2E89_A 2EG5_E 2EJW_A 2EP5_B 2F4M_A 2F4N_C 2FV2_C 2GSZ_F 2GVQ_C 2GZA_A 2HYX_C 2HZG_A 2HZK_D 2I3T_A 2I7N_B 2IJZ_G 2IP2_B 2J0Q_B 2J5T_G 2J6X_G 2MTA_HL 2NQL_A 2OBN_D 2OGJ_E 2OIZ_B 2OOR_AB 2OZK_B 2PBI_B 2PMS_A 2PP1_A 2PVP_A 2Q0J_A 2QDH_A 2QFC_A 2QGI_A 2QXV_A 2QYO_A 2R87_A 2R8Q_B 2UX8_C 2V3B_A 2V7X_C 2V9P_G 2V9T_B 2VCG_D 2VHI_C 2VHW_A 2VN8_A 2VUN_C 2WPX_B 2WUS_A 2WVM_A 2WYR_G 2X0D_A 2X2E_D 2X5D_D 2X65_B 2XT2_A 2XWT_C 2Y0M_A 2Y5B_A 2YCH_A 2Z4R_B 2Z50_A 2Z71_C 2Z9V_B 2ZBK_A 2ZIU_A 2ZIU_B 2ZUC_B 2ZZX_A 3AB1_B 3AEO_C 3AFO_A 3AP2_A 3AUY_A 3B5U_J 3BH6_B 3BM5_A 3BP8_AB 3BT1_U 3BTV_B 3BV6_D 3BWO_D 3C0B_C 3C0K_B 3C3J_F 3C48_A 3CE9_A 3CEA_B 3CQ6_A 3CYJ_B 3D6K_B 3DDM_B 3DHW_D 3DP7_A 3DUG_C 3DZ2_A 3DZC_B 3E18_A 3E38_B 3E5P_C 3E9M_A 3EIQ_C 3EPW_B 3ES8_H 3EUA_H 3EZ6_B 3EZY_A 3FGT_B 3FHC_A 3FZ0_B 3G0I_A 3G8Q_C 3G8R_A 3GJZ_A 3GL1_A 3GZT_O 3H6G_B 3H77_B 3H8L_B 3H9G_A 3HE3_F 3HGU_A 3HLI_A 3HMK_B 3HPV_B 3HWS_D 3HXJ_A 3IAU_A 3IF8_A 3IGF_B 3IO1_A 3ISL_B 3IX1_B 3JSK_G 3JTX_A 3K5H_A 3KKI_A 3KL5_B 3KL9_J 3L31_A 3L9W_B 3LED_A 3LEE_A 3LJQ_C 3LKU_E 3LMA_C 3LOU_C 3LVK_AC 3M2T_A 3MCA_B 3MCZ_A 3MEN_B 3MGC_A 3MKR_A 3MMY_G 3MWE_B 3MZK_D 3N29_A 3N3D_A 3NND_C 3NTQ_A 3NVN_A 3NVV_B 3O3M_D 3O3P_A 3O5T_A 3OBK_F 3OM1_A 3ON5_A 3OOQ_H 3OQB_D 3OV3_B 3P6K_B 3P72_A 3P9I_C 3PG9_H 3PGA_1 3PND_D 3PNK_B 3PUZ_B 3PWS_A 3QBX_B 3QE9_Y 3QKW_C 3QML_D 3QW2_B 3R0Q_A 3R1X_A 3R5X_D 3R9A_AC 3RAM_D 3RCY_C 3RF6_B 3RFH_A 3RHF_B 3RMR_A 3RT0_A 3S5U_E 3SF5_D 3SJA_I 3SN6_A 3SSO_B 3SYL_A 3SZP_A 3T5P_A 3T8E_A 3THO_A 3THO_B 3TII_B 3TK1_B 3TQC_B 3TWO_B 3U5Z_B 3UGV_C 3UI2_A 3UK7_A 3UVN_C 3V5N_C 3VGK_E 3VH0_D 3VH3_A 3VV2_A 3VYR_B 3WN7_A 3ZWL_B 4BKX_B 4C9B_B 4DVG_B 4ETP_A 4ETP_B 4FZV_A 4HDO_A 4LVN_A 4M0W_A 4V0O_F 4X33_B 4XL5_C 4Y61_B 4YC7_B 4YEB_A 4ZGY_A 4ZRJ_A 5BV7_A 5CXB_B 5J57_A 5TIH_A 5XIM_A 7MDH_B 4JLR_S ================================================ FILE: lists/testing_ppi.txt ================================================ 1A2K_C_AB 1A2W_A_B 1A79_C_B 1A99_C_D 1ACB_E_I 1AGQ_C_D 1AHS_C_B 1AK4_A_D 1AN1_E_I 1ARZ_A_C 1ATN_A_D 1AVX_A_B 1AY7_A_B 1B27_A_D 1B2S_A_D 1B2U_A_D 1B3S_A_D 1B3T_A_B 1B65_A_B 1B6C_A_B 1BJR_I_E 1BO4_A_B 1BPO_C_B 1BRS_A_D 1C3X_A_C 1C8N_A_C 1C9P_A_B 1C9S_G_H 1C9T_A_G 1CBW_ABC_D 1CGI_E_I 1CL7_I_H 1CQ3_A_B 1D6R_A_I 1DB2_A_B 1DEV_C_D 1DFJ_E_I 1DJS_A_B 1DLE_A_B 1DML_A_B 1DN2_B_F 1E5Q_C_D 1E8N_A_I 1EAI_A_C 1EAW_A_B 1EJA_A_B 1EM8_A_B 1EPT_A_B 1ERN_A_B 1EWJ_C_D 1EWY_A_C 1EZI_A_B 1EZU_C_AB 1F2U_C_D 1F37_A_B 1F45_A_B 1F5R_A_I 1F7Z_A_I 1F9S_A_D 1FCC_AB_C 1FFV_A_C 1FGL_A_B 1FIW_A_L 1FLE_E_I 1FU5_A_B 1FY8_E_I 1G31_C_B 1G60_A_B 1G9I_E_I 1GCQ_C_B 1GGP_A_B 1GL0_E_I 1GL1_A_I 1GO4_D_H 1GT7_O_P 1GUS_C_E 1GXD_A_C 1H1V_A_G 1H6D_I_J 1H9R_A_B 1HAA_A_B 1HBT_I_H 1HCF_AB_X 1HEZ_BA_E 1HIA_AB_I 1HPU_C_B 1HX5_A_B 1HYR_A_C 1I07_A_B 1I4E_A_B 1I4O_B_D 1I9C_C_D 1ICF_A_I 1ID5_H_L 1IGU_A_B 1IJX_B_E 1INN_A_B 1IYJ_C_D 1J3R_A_B 1J4U_A_B 1JBU_H_X 1JFM_E_D 1JIW_P_I 1JK9_B_A 1JK9_B_D 1JK9_C_D 1JKG_A_B 1JNP_A_B 1JTD_B_A 1JXQ_C_D 1JYI_A_P 1JZO_A_B 1K88_A_B 1KAC_A_B 1KCA_G_H 1KL8_A_B 1KXJ_A_B 1KXP_A_D 1L0A_A_B 1L2W_C_J 1L4D_A_B 1L4I_A_B 1L4Z_A_B 1LDT_T_L 1LK6_I_C 1LQM_E_F 1LW6_E_I 1M1F_A_B 1MAS_A_B 1MBY_A_B 1MCV_A_I 1MK9_G_F 1ML0_AB_D 1MR1_A_D 1MZW_A_B 1N0L_C_D 1NB5_AP_I 1NP6_A_B 1NPO_A_C 1NQ9_I_L 1NQL_A_B 1NR7_A_E 1NR9_C_D 1NU9_A_C 1O9A_A_B 1O9Y_A_D 1OMO_A_B 1OS2_E_F 1OSM_C_B 1OX9_D_L 1OYV_B_I 1P3H_I_H 1P69_A_B 1P6A_A_B 1P9U_F_H 1PBI_A_B 1PGL_1_2 1POI_A_D 1PPE_E_I 1PVH_A_B 1PXV_A_C 1PXV_B_D 1Q1L_B_D 1Q5H_A_B 1Q8M_A_B 1Q9U_A_B 1QB3_A_C 1QI1_C_B 1QJS_A_B 1QOL_G_F 1R0K_C_D 1R0R_E_I 1R7A_A_B 1R9N_D_H 1RY7_A_B 1RZJ_C_G 1RZP_C_B 1S1Q_A_B 1S4C_C_B 1S98_A_B 1SCE_A_C 1SCE_B_D 1SHS_A_C 1SHS_A_E 1SHW_A_B 1SHY_A_B 1SMF_E_I 1SMO_A_B 1SOT_A_C 1SUW_C_D 1T0F_A_B 1T0H_A_B 1T0P_A_B 1T6B_X_Y 1T7P_A_B 1T8U_A_B 1TAW_A_B 1TE1_A_B 1TM1_E_I 1TM3_E_I 1TM4_E_I 1TM5_E_I 1TM7_E_I 1TO1_E_I 1TQ9_A_B 1TZI_BA_V 1TZS_A_P 1U20_A_B 1UAN_A_B 1UDI_E_I 1UE7_C_D 1UGH_E_I 1UHE_A_B 1UK4_A_G 1UM2_A_C 1UMF_B_D 1UNN_A_B 1UP6_A_D 1UUG_A_B 1UWG_L_X 1V8H_A_B 1VG9_E_G 1VGC_C_B 1VGO_A_B 1VH4_A_B 1VHJ_C_F 1VS3_A_B 1VZY_A_B 1W1I_B_E 1W4R_A_D 1WDX_C_B 1WLP_A_B 1WOQ_A_B 1WQJ_B_I 1WZ3_A_B 1X1U_A_D 1X1W_A_D 1X1X_A_D 1X1Y_A_D 1XD3_A_B 1XD3_C_D 1XDT_T_R 1XFS_A_B 1XG2_A_B 1XPJ_A_D 1XSQ_A_B 1XT9_A_B 1XUA_A_B 1XV2_A_B 1XWD_A_B 1Y07_A_B 1Y0G_A_B 1Y1K_E_I 1Y1O_A_B 1Y33_E_I 1Y34_E_I 1Y3B_E_I 1Y3C_E_I 1Y3D_E_I 1Y43_A_B 1Y48_E_I 1Y4A_E_I 1Y4D_E_I 1Y96_A_B 1YBG_A_B 1YC0_A_I 1YC6_3_E 1YCS_A_B 1YFN_D_H 1YL7_A_D 1YLQ_A_B 1YOX_C_B 1YUK_A_B 1YVB_A_I 1YY9_A_D 1Z0K_A_C 1Z3G_A_H 1Z3G_B_I 1Z5Y_D_E 1ZCP_A_B 1ZH8_A_B 1ZJD_A_B 1ZLI_A_B 1ZR0_A_B 1ZUD_3_4 1ZVN_A_B 2A0S_A_B 2A2L_C_B 2A5Z_A_C 2A6P_A_B 2A74_E_F 2ABZ_B_E 2AF6_B_D 2AFF_A_B 2ANE_C_D 2AOB_C_D 2AQX_A_B 2AVF_C_B 2AXW_A_B 2AZN_A_D 2B3Z_C_D 2B42_B_A 2BBA_A_P 2BCM_C_B 2BE1_A_B 2BMA_C_B 2BTF_A_P 2BUJ_A_B 2C1W_A_B 2C35_D_H 2C7E_C_D 2C9P_A_B 2CCL_A_C 2CE8_A_B 2CH8_A_D 2CJR_A_B 2CO6_A_B 2D10_A_E 2D1P_D_G 2D2A_A_B 2DG0_E_H 2DOH_X_C 2DOI_X_C 2DP4_I_E 2DPF_C_D 2DSP_B_I 2DUP_A_B 2DYM_G_H 2E4M_A_C 2EIL_A_F 2EJG_B_D 2EP5_B_D 2ETE_A_B 2EVV_C_D 2EWN_A_B 2F2F_C_B 2FB8_A_B 2FBE_C_D 2FDB_M_P 2FE8_A_C 2FJU_B_A 2FKD_G_J 2FP7_A_B 2FPE_A_B 2FTL_E_I 2FTM_A_B 2FU5_A_D 2G2U_A_B 2G2W_A_B 2G45_A_B 2G6V_A_B 2G81_E_I 2GBK_B_D 2GD4_C_B 2GEC_A_B 2GEF_A_B 2GHV_C_E 2GHW_C_D 2GJV_C_D 2GKW_A_B 2GQS_A_B 2GS7_A_B 2GT2_A_B 2H1T_A_B 2H3N_A_B 2H5K_A_B 2HAX_A_B 2HD3_C_D 2HD3_E_F 2HDP_A_B 2HEK_A_B 2HEY_T_G 2HJ1_A_B 2HL3_A_B 2HLE_A_B 2HQH_B_F 2HQL_A_E 2HTB_C_D 2HVB_A_B 2HVY_A_C 2HWJ_A_C 2HZM_G_H 2HZS_B_H 2HZS_F_K 2I04_A_B 2I0B_A_B 2I32_A_E 2I5G_A_B 2I79_C_B 2I7R_A_B 2I9B_C_G 2IA9_A_B 2IDO_A_B 2IHS_A_C 2IJ0_C_B 2IO1_A_B 2IQH_A_C 2IWO_A_B 2IWP_A_B 2IY1_A_B 2J12_A_B 2J7Q_C_D 2J8X_A_B 2JG8_D_F 2JI1_C_D 2JJS_A_C 2JJS_B_D 2JJT_A_C 2JOD_A_B 2K2S_A_B 2K6D_A_B 2KAI_A_B 2KWJ_A_B 2L0F_A_B 2L29_A_B 2LBU_E_D 2MCN_A_B 2MNU_A_B 2MTA_HL_A 2NBV_A_B 2NM1_A_B 2NN3_C_D 2NQD_A_B 2NU1_I_E 2NUU_K_L 2NXM_A_B 2NZ1_X_Y 2O8Q_A_B 2O95_A_B 2O9Q_A_C 2OGJ_E_F 2OIN_A_C 2OKQ_A_B 2OPI_A_B 2OS5_A_D 2OS7_C_F 2OTL_A_Z 2OUL_A_B 2OVI_A_D 2OYA_A_B 2OZK_B_D 2P04_A_B 2P35_A_B 2P42_A_B 2P43_A_B 2P44_A_B 2P45_A_B 2P46_A_B 2P47_A_B 2P48_A_B 2P49_A_B 2P4A_A_B 2P4R_A_T 2P4Z_A_B 2P5X_A_B 2P6B_A_E 2PKG_A_C 2PMV_A_B 2PNH_A_B 2PO2_A_B 2PQ2_A_B 2PQS_A_B 2PQV_A_B 2PTC_E_I 2PUY_B_E 2PZD_A_B 2Q17_C_B 2Q7N_A_B 2Q81_A_D 2QBW_A_B 2QBX_A_P 2QC1_A_B 2QF3_A_C 2QKI_A_G 2QLC_C_B 2QLP_A_C 2QW7_I_H 2QYI_C_D 2R0K_A_H 2R2C_A_B 2R5O_A_B 2R9P_A_E 2RA3_A_C 2RL7_C_D 2SIC_E_I 2SNI_E_I 2TGP_Z_I 2UUY_A_B 2V0R_A_B 2V3B_A_B 2V52_B_M 2VE6_A_D 2VER_A_N 2VIF_A_P 2VJF_C_D 2VPM_A_B 2VSC_A_B 2W0C_C_B 2W1T_A_B 2W2N_A_E 2W80_A_D 2W80_G_H 2W81_A_D 2WAM_A_C 2WC4_A_C 2WFX_A_B 2WG3_A_C 2WG4_A_B 2WLG_C_B 2WO2_A_B 2WO3_A_B 2WQ4_A_C 2WQZ_A_D 2WVT_A_B 2WWX_A_B 2X36_C_D 2X53_W_V 2X5Q_A_B 2X89_F_G 2X8K_A_B 2X9A_A_D 2X9A_C_D 2X9M_B_D 2XB6_A_C 2XBB_A_C 2XCE_E_D 2XFG_A_B 2XJZ_C_K 2XTJ_A_D 2Y32_B_D 2Y9X_B_F 2YC2_A_D 2YCH_A_B 2YH9_A_C 2YVJ_A_B 2YVL_B_D 2YVS_A_B 2YYS_A_B 2YZJ_A_C 2Z0E_A_B 2Z0P_C_D 2Z29_A_B 2Z2M_C_B 2Z7F_E_I 2Z7X_A_B 2Z8M_A_B 2ZA4_A_B 2ZCK_P_S 2ZDC_A_B 2ZG6_A_B 2ZME_A_C 2ZNV_E_D 2ZSU_A_B 2ZVW_C_E 2ZVW_C_K 2ZXW_O_U 3A1P_C_D 3AD8_B_D 3AEH_A_B 3AFF_A_B 3AHS_A_C 3AJY_A_C 3ALZ_A_B 3AOG_H_L 3AXY_B_D 3B01_A_C 3B08_A_B 3B5U_B_D 3B5U_J_L 3B6P_B_D 3B76_A_B 3B93_A_C 3B9I_A_B 3BAL_A_B 3BCP_A_B 3BCW_A_B 3BFW_C_D 3BGL_C_B 3BHD_A_B 3BIW_A_E 3BN3_A_B 3BPD_G_F 3BQB_A_X 3BRC_A_B 3BRD_A_D 3BT1_B_U 3BTV_A_B 3BWU_C_D 3BX1_A_C 3BX7_A_C 3C0B_C_D 3C4O_A_B 3C4P_A_B 3C7T_A_C 3C8I_A_B 3CAM_A_B 3CDW_A_H 3CE9_A_D 3CEW_C_D 3CG8_C_B 3CGY_A_B 3CHW_A_P 3CJX_G_H 3CO2_A_D 3CQ9_C_D 3D1E_A_P 3D1M_A_D 3D4G_C_D 3D4R_A_B 3D5N_F_I 3DA7_A_D 3DAW_A_B 3DAX_A_B 3DCA_C_D 3DCL_A_B 3DGP_A_B 3DJP_A_B 3DKU_A_B 3DQQ_A_B 3DSN_C_B 3E05_B_H 3E05_C_B 3E1Z_A_B 3E2K_A_D 3E2L_A_C 3E2U_A_E 3E38_A_B 3E9M_A_D 3ECY_A_B 3EDP_A_B 3EHU_A_C 3EMJ_K_L 3EN0_A_B 3ENT_A_B 3EPZ_A_B 3EUK_C_E 3EYD_C_D 3F5N_A_D 3F74_A_B 3F75_A_P 3FCG_A_B 3FD4_A_B 3FEF_C_D 3FFU_A_B 3FG8_C_E 3FHC_A_B 3FJS_C_D 3FJU_A_B 3FK9_A_B 3FL1_A_B 3FLP_M_N 3FP6_E_I 3FPR_A_D 3FPU_A_B 3FPV_A_F 3FSN_A_B 3FUY_A_B 3FYF_A_B 3G9V_A_B 3GBU_A_D 3GFU_A_B 3GMW_A_B 3GNJ_C_D 3GQH_A_B 3GRW_A_H 3GWY_A_B 3GXU_A_B 3GZ8_A_B 3GZE_A_X 3GZE_C_Y 3GZR_A_B 3H11_BC_A 3H35_C_B 3H3B_A_C 3H6S_A_E 3H8D_B_F 3H8G_B_E 3H9G_A_E 3HCG_A_C 3HF5_A_D 3HHJ_A_B 3HLN_O_U 3HM8_A_C 3HMK_A_B 3HN6_B_D 3HO5_B_H 3HPN_E_F 3HQR_A_S 3HRD_E_H 3HT2_A_C 3HTR_A_B 3I2B_E_H 3I5V_A_D 3I84_A_B 3IAS_G_F 3IBM_A_B 3ISM_A_B 3JRQ_A_B 3JUY_C_B 3JVC_A_C 3JVZ_B_D 3JZA_A_B 3K1R_A_B 3K25_A_B 3K3C_A_B 3K4W_D_F 3K6S_A_E 3K9M_A_C 3K9M_B_D 3KDG_A_B 3KL9_I_J 3KLQ_A_B 3KMH_A_B 3KMT_A_B 3KQZ_K_L 3KTM_C_F 3KTS_A_B 3KW5_A_B 3KWV_D_F 3KY8_A_B 3KZH_A_B 3L2H_A_D 3L33_A_E 3L9J_C_T 3LAQ_A_U 3LHX_A_B 3LM1_E_F 3LMS_A_B 3LQV_B_Q 3LRJ_C_D 3LU9_E_F 3M5O_A_C 3M5R_A_G 3M85_B_E 3M85_B_G 3MAL_A_B 3ME4_A_B 3MJ9_A_H 3ML6_B_F 3MQW_C_D 3MZW_A_B 3N2B_A_C 3N4I_A_B 3N6Q_E_H 3NCT_B_D 3NEK_A_B 3NFG_G_H 3NGB_E_G 3NPG_C_D 3NRJ_A_H 3NS1_A_B 3NTQ_A_B 3O2X_B_D 3O34_A_B 3O9L_A_B 3OEU_2_M 3OGF_A_B 3OGO_A_E 3OJ2_A_C 3OJM_A_B 3OKJ_C_D 3OLM_A_D 3OSL_A_B 3OZB_A_C 3P71_C_T 3P83_B_F 3P8B_C_D 3P92_A_E 3P95_A_E 3P9W_A_B 3PCQ_C_D 3PGA_1_4 3PIG_A_B 3PIM_A_B 3PNR_A_B 3PPE_A_B 3PRP_A_B 3PS4_C_B 3PYY_A_B 3Q0Y_C_B 3Q7H_K_M 3Q87_A_B 3Q9N_A_C 3Q9U_A_C 3QC8_A_B 3QDZ_B_E 3QFM_A_B 3QHY_A_B 3QJ7_A_D 3QNA_A_D 3QPB_K_J 3QQ8_A_B 3QSK_A_B 3QWN_I_J 3QWQ_A_B 3RBQ_B_H 3RDZ_A_C 3RT0_A_C 3S5B_A_B 3S8V_A_X 3S9C_A_B 3SGB_E_I 3SGQ_E_I 3SJ9_A_B 3SLH_A_B 3SM1_A_B 3SOQ_A_Z 3T3A_A_B 3TDM_A_B 3TG9_A_B 3TGK_E_I 3THT_A_B 3TII_A_B 3TIW_B_D 3TL8_A_B 3TND_B_D 3TQY_A_B 3TSR_A_E 3TSZ_A_B 3TU3_A_B 3U02_B_D 3U1O_A_B 3U4J_C_B 3UI2_A_B 3UIR_A_C 3UVN_C_D 3UZP_A_B 3UZV_A_B 3V3K_A_B 3V4P_B_H 3V5N_C_D 3V96_A_B 3VPJ_A_E 3VYR_A_B 3WA5_A_B 3WDG_A_B 3WN7_A_B 3ZRZ_A_C 3ZWL_B_E 4A94_A_D 4AFQ_A_C 4AFZ_A_C 4AG2_A_C 4AN7_A_B 4AOQ_A_D 4AOR_A_D 4APF_A_B 4AYD_A_D 4AYE_A_D 4AYI_A_D 4B1V_B_N 4B1X_B_M 4B1Y_B_M 4BD9_A_B 4BQD_A_C 4BWQ_E_F 4CDK_A_E 4CJ0_A_B 4CJ1_A_B 4CMM_A_B 4CPA_A_I 4DG4_A_E 4DGE_A_C 4DOQ_A_B 4EIG_A_B 4EQA_A_C 4F0A_A_B 4FT4_B_Q 4FZA_A_B 4G6U_A_B 4GH7_A_B 4GI3_A_C 4HDO_A_B 4I6L_A_B 4ILW_A_D 4IOP_A_B 4J2Y_A_B 4JRA_A_D 4JW3_A_C 4K1R_A_B 4K24_A_U 4KBB_A_C 4KDI_A_C 4KFZ_A_C 4KGG_C_A 4KR0_A_B 4KRL_B_A 4KSD_A_B 4KV5_C_D 4L0P_A_B 4LAD_A_B 4LLO_A_B 4LQW_A_D 4LYL_A_B 4M0W_A_B 4M5F_A_B 4MSM_A_B 4NOO_A_B 4NSO_A_B 4NZL_A_B 4NZW_A_B 4PEQ_A_B 4PJ2_A_D 4POU_A_B 4PQT_A_B 4QT8_A_C 4QZV_A_B 4RS1_B_A 4TQ0_A_B 4TQ1_A_B 4U30_A_X 4U97_A_B 4UDM_B_A 4V0M_F_E 4V0N_D_C 4V0O_F_E 4W6X_A_B 4WEM_A_B 4WEN_A_B 4XL1_A_B 4XL5_A_C 4XLW_A_B 4XXB_A_B 4YDJ_HL_G 4YEB_A_B 4YN0_A_B 4YWC_A_C 4ZK9_A_B 4ZKC_A_B 4ZQU_A_B 5AYR_A_B 5AYS_A_C 5B75_A_B 5B76_A_B 5B77_A_B 5B78_A_B 5CJO_HL_A 5D1K_A_B 5D1L_A_B 5D1M_A_B 5D3I_A_B 5DJT_A_B 5DMJ_A_B 5EB1_A_B 5F3X_A_B 5F4E_A_B 5G1X_A_B 5GPG_A_B 5HPK_A_B 5INB_A_B 5IOH_A_B 5J28_A_C 5JKE_A_B 5JLV_A_C 5JMC_A_B 5JYL_A_B 6CMG_CB_A 4ZQK_A_B 3BIK_A_B ================================================ FILE: lists/training.txt ================================================ 1A0G_B 1A0H_D 1A22_A 1A2K_AB 1A6J_B 1A79_C 1AA7_A 1ACB_I 1AIH_D 1ARZ_C 1AVA_C 1AVO_K 1AVO_L 1AY7_A 1AZS_AB 1B0N_A 1B27_A 1B27_D 1B35_B 1B35_C 1B4U_C 1B65_D 1B6C_B 1B9L_D 1B9M_A 1B9Y_C 1BBH_A 1BC5_A 1BCP_H 1BCP_L 1BCR_A 1BCR_B 1BDF_D 1BIH_A 1BJA_A 1BO4_A 1BPL_A 1BVN_T 1BVP_2 1C3X_A 1C8N_C 1C8O_A 1C8U_B 1CGI_I 1CLI_A 1CMV_B 1CN4_B 1CQ3_B 1CQI_B 1D2Z_A 1D2Z_B 1D8H_A 1D9E_B 1DB2_A 1DBQ_B 1DBW_B 1DHK_B 1DJ8_B 1DK4_A 1DLE_A 1DLT_A 1DM9_B 1DML_A 1DNW_B 1DPJ_A 1DQN_A 1DS8_L 1DXX_C 1E3U_A 1E44_A 1E4K_C 1E6E_B 1E96_B 1EAI_C 1EBO_F 1EER_A 1EEX_G 1EF1_D 1EFV_B 1EI1_B 1EK6_A 1EL6_A 1EM8_A 1EM8_B 1EMU_A 1ETE_C 1EWJ_D 1EWY_C 1EXB_ABDC 1EZI_A 1EZU_AB 1F15_B 1F34_B 1F36_A 1F37_B 1F3M_B 1F3M_D 1F3R_B 1F3U_G 1F3U_H 1F3V_A 1F51_AB 1F51_E 1F5M_B 1F5Z_C 1F8Y_B 1FAK_HL 1FB1_A 1FBV_A 1FBV_C 1FCD_D 1FFW_A 1FJ1_E 1FK8_A 1FLC_F 1FNE_C 1FNE_D 1FOD_1 1FOD_2 1FQ1_A 1FS0_E 1FS0_G 1FSK_A 1FU5_A 1FYH_A 1FYH_B 1FZ0_E 1G0S_B 1G0U_Z 1G31_C 1G5G_F 1G5H_A 1G60_A 1G64_B 1G6W_D 1G8K_B 1G8Y_G 1GCQ_C 1GGP_B 1GK0_C 1GK9_A 1GLA_F 1GMW_D 1GO4_H 1GPQ_B 1GPW_A 1GQA_A 1GQG_B 1GRC_A 1GRI_A 1GRN_B 1GT7_P 1GU9_H 1GUQ_A 1GUS_C 1GVM_F 1GX7_D 1GXD_C 1GXJ_B 1GYY_A 1GZS_B 1H0D_C 1H0H_L 1H21_C 1H2I_P 1H2S_A 1H2S_B 1H2U_Y 1H3L_B 1H6W_A 1H74_A 1H9D_A 1H9D_B 1HAA_A 1HCF_AB 1HE1_B 1HI9_D 1HJR_D 1HKQ_A 1HN2_A 1HXM_C 1HXM_D 1HYR_A 1I1A_A 1I1D_C 1I4D_AB 1I4E_A 1I50_J 1I78_A 1I7Q_D 1I8L_A 1IAH_B 1IAR_A 1IAR_B 1IB1_E 1ICF_I 1IGU_B 1II8_A 1II8_B 1IJF_B 1IJK_BC 1IJL_B 1IJX_E 1IK9_A 1INN_A 1IQ6_B 1IR2_7 1IRA_X 1IRA_Y 1IS7_R 1IWA_F 1J1D_C 1J2U_A 1J2W_B 1J3K_B 1J3L_A 1J3R_A 1J4U_B 1J7D_A 1J7V_L 1J9I_A 1JAY_A 1JD6_A 1JFM_E 1JIW_I 1JK9_B 1JK9_C 1JKG_A 1JKG_B 1JMA_A 1JMA_B 1JMT_A 1JMV_A 1JN9_C 1JNB_F 1JNP_A 1JNZ_B 1JPY_Y 1JSU_C 1JWH_A 1JWH_CD 1JX7_E 1JYI_A 1JYO_D 1JYO_E 1JZD_AB 1JZD_C 1JZT_A 1K0Z_B 1K2E_A 1K3S_A 1K4R_C 1K50_B 1K5D_AB 1K5D_C 1K66_B 1K74_AB 1K74_DE 1KBQ_A 1KCA_G 1KCF_A 1KI9_C 1KIG_I 1KJN_B 1KKL_ABC 1KKL_H 1KM1_A 1KNX_E 1KNY_A 1KTK_B 1KTZ_B 1KVE_C 1KVE_D 1KXJ_A 1KY6_A 1L0A_A 1L2W_C 1L2W_J 1L4Z_B 1L5X_B 1L8C_B 1L8D_A 1L8L_A 1LBH_A 1LFD_C 1LHR_B 1LI1_D 1LJ2_B 1LK5_A 1LKY_D 1LM7_A 1LQS_L 1LQW_A 1LSS_B 1LT7_B 1LUA_C 1LUC_A 1LWI_A 1LX5_B 1LZW_B 1M1E_B 1M1F_A 1M27_AB 1M7E_C 1M7U_A 1MAH_F 1MD0_A 1MHP_B 1MKM_B 1MOE_A 1MPS_H 1MPS_M 1MR1_D 1MR9_B 1MW5_A 1MWQ_A 1MZW_A 1N0E_A 1N0L_C 1N0L_D 1N1C_A 1N1E_A 1N2M_E 1N4M_B 1N80_D 1N9J_B 1N9S_F 1NA1_A 1NA6_B 1NBA_C 1NF3_A 1NF3_C 1NFV_H 1NHW_B 1NHW_D 1NKI_B 1NKQ_E 1NKV_A 1NLN_A 1NN4_C 1NOV_A 1NP3_C 1NP6_B 1NPO_A 1NPP_A 1NSN_S 1NT2_B 1NU9_C 1NVI_D 1NVI_E 1NVM_A 1NWW_B 1NZ0_A 1O1N_A 1O28_A 1O63_A 1O94_C 1O94_D 1O9I_A 1O9Y_D 1OA8_A 1OB8_B 1OCZ_R 1OEY_A 1OEY_J 1OFU_A 1OFU_Y 1OG6_C 1OIA_A 1OJH_D 1OLP_C 1OMO_B 1OOQ_A 1OPH_A 1OQ1_D 1OQB_D 1OQC_D 1OQJ_A 1OR6_A 1OR7_A 1OR7_C 1ORQ_C 1ORY_A 1OSG_F 1OSM_C 1OTW_A 1OW4_A 1OX9_D 1OY1_A 1OY5_C 1OYV_I 1P27_A 1P27_B 1P32_A 1P3H_H 1P4O_B 1P4Q_A 1P4Q_B 1P69_A 1P7G_J 1P8C_E 1P9O_B 1PB0_A 1PBI_B 1PC6_A 1PCF_F 1PIV_3 1PK1_A 1PK1_B 1PM3_A 1PNB_B 1POI_D 1PQZ_A 1PUG_C 1PUI_A 1PVH_A 1PXV_B 1PXV_D 1PYA_F 1PYT_A 1PZM_B 1PZR_A 1Q05_B 1Q0K_K 1Q23_H 1Q2H_A 1Q40_C 1Q40_D 1Q5H_B 1Q6I_B 1Q74_A 1Q7L_C 1Q7L_D 1Q8M_A 1Q9U_B 1QA9_A 1QA9_B 1QAV_B 1QB3_A 1QCB_H 1QD6_D 1QE6_D 1QEX_B 1QFH_B 1QG7_B 1QHH_A 1QHH_B 1QIP_D 1QJG_E 1QL0_A 1QOL_G 1QQ5_B 1QS4_B 1QSO_B 1QXN_B 1QXO_D 1QYN_A 1R15_E 1R1U_A 1R30_B 1R4A_H 1R52_C 1R5I_D 1R5X_A 1R6Q_C 1R7H_B 1R7I_B 1R8O_B 1R8S_E 1RDF_B 1RF8_A 1RF8_B 1RFZ_A 1RHG_A 1RHZ_B 1RK4_A 1RKE_A 1RLB_ABCD 1RLB_E 1RLI_C 1RO7_C 1RPN_D 1RV6_VW 1RY7_A 1RY7_B 1S1Q_A 1S28_C 1S3N_A 1S3Z_A 1S4C_B 1S4K_A 1S59_C 1S7M_A 1SBB_B 1SFK_A 1SFX_A 1SG2_C 1SG4_B 1SGJ_A 1SHS_E 1SHZ_C 1SIE_B 1SKV_A 1SLQ_E 1SOT_A 1SP8_D 1SPB_P 1SPI_A 1SPP_B 1SQ7_B 1SQB_D 1SQE_B 1SQX_I 1SR4_A 1SS4_A 1STM_D 1STZ_A 1SU1_A 1SUS_C 1SV0_C 1SWJ_B 1SY6_A 1SYX_A 1SYX_B 1SZH_A 1T0B_C 1T0F_A 1T0P_B 1T0R_C 1T1V_A 1T33_A 1T3L_A 1T3U_B 1T3W_B 1T62_B 1T6B_Y 1T6S_A 1T70_C 1T8Q_B 1T9G_C 1TA3_B 1TBA_A 1TBX_A 1TDQ_A 1TDT_A 1TE1_A 1TE1_B 1TE2_A 1TH1_C 1TH7_H 1THN_C 1TIJ_A 1TJO_A 1TKV_B 1TLH_B 1TLJ_A 1TMQ_B 1TMX_A 1TOA_A 1TQ8_D 1TU1_B 1TUE_Q 1TY4_A 1TY9_B 1U07_A 1U0S_A 1U20_A 1U2E_C 1U2V_G 1U4F_D 1U5U_A 1U5W_E 1U69_B 1U6G_B 1U6J_G 1U7H_A 1U7I_A 1U7Z_B 1U8S_B 1UAD_C 1UAN_A 1UD0_A 1UDI_I 1UFO_C 1UHE_A 1UI5_B 1UIJ_A 1UJ3_C 1UK4_A 1UL1_A 1ULG_D 1UNN_C 1UR6_B 1USV_B 1USY_A 1UT4_B 1UUN_A 1V1H_E 1V54_Q 1V5X_A 1V8D_A 1V8H_B 1V8P_G 1VB5_B 1VCB_F 1VCH_D 1VDD_A 1VEA_B 1VET_A 1VEU_B 1VG0_B 1VGL_D 1VGO_B 1VH0_B 1VH5_B 1VH6_B 1VHZ_A 1VJL_A 1VJQ_A 1VKM_B 1VMD_A 1VP2_A 1VR7_A 1VR9_A 1VRB_B 1VS3_A 1VSG_A 1VSQ_B 1VYH_M 1VZY_A 1W1I_E 1W39_C 1W3B_A 1W3Z_A 1W6U_C 1W9A_B 1W9Z_B 1WB4_A 1WD6_A 1WDJ_A 1WDW_A 1WDX_C 1WDZ_A 1WEK_D 1WKQ_A 1WLI_B 1WLP_B 1WMI_A 1WMI_B 1WN1_A 1WOQ_B 1WOV_A 1WP7_A 1WPX_B 1WQ1_G 1WRD_A 1WRS_R 1WSC_A 1WTU_B 1WWP_B 1WWR_B 1WX0_D 1WYW_A 1WYZ_D 1WZ3_B 1WZ7_B 1X2H_C 1X8D_A 1X9A_B 1XCR_B 1XD3_A 1XD9_A 1XDK_F 1XEB_A 1XF6_B 1XF6_D 1XFS_A 1XG2_B 1XG5_C 1XHN_A 1XIW_F 1XJ7_A 1XKP_A 1XKP_B 1XKP_C 1XL3_D 1XLY_A 1XM3_B 1XOU_A 1XOU_B 1XPJ_A 1XQH_A 1XR0_B 1XSQ_B 1XT9_A 1XTG_B 1XTT_C 1XUA_B 1XUV_A 1XV2_A 1XWD_A 1XX7_B 1XY7_B 1XZ8_A 1Y0B_D 1Y0G_B 1Y0H_A 1Y0U_A 1Y10_A 1Y1A_B 1Y1O_A 1Y23_D 1Y2I_E 1Y43_B 1Y4M_A 1Y4Z_C 1Y60_D 1Y6K_R 1Y7R_B 1Y82_A 1Y8N_A 1Y8N_B 1Y8T_A 1Y96_A 1YAF_A 1YAU_Q 1YAV_B 1YC6_E 1YCS_B 1YD8_H 1YDG_E 1YEW_I 1YEW_J 1YF9_B 1YJ7_D 1YJD_C 1YKE_C 1YKE_D 1YLM_B 1YLQ_A 1YLX_A 1YNJ_K 1YNT_G 1YOX_C 1YQF_F 1YRB_B 1YUM_D 1YV1_B 1YWK_A 1YYV_A 1Z0K_B 1Z2X_A 1Z3G_A 1Z5Y_E 1Z69_C 1Z6O_B 1Z6O_M 1Z7M_B 1Z7U_A 1Z8K_A 1Z94_C 1ZBX_A 1ZC4_D 1ZDN_A 1ZFN_A 1ZHI_B 1ZKE_F 1ZKP_B 1ZM4_B 1ZN7_B 1ZNP_B 1ZOQ_B 1ZPQ_D 1ZPS_B 1ZTX_E 1ZUD_4 1ZXM_B 1ZXZ_A 1ZY4_A 1ZY7_A 2A0S_B 2A19_A 2A1F_C 2A1S_D 2A2J_A 2A2L_B 2A2O_E 2A40_E 2A4W_B 2A5D_B 2A5T_B 2A5Z_C 2A61_C 2A67_D 2A6A_A 2A6P_B 2A6Q_F 2A78_B 2A7K_H 2A7U_B 2A7W_J 2A9S_A 2ABZ_E 2ACM_A 2ADF_A 2ADL_A 2AE8_E 2AF6_B 2AFF_A 2AHM_B 2AHM_F 2ANU_A 2AO9_A 2AP6_B 2AQX_A 2ARJ_Q 2ARK_D 2ARP_F 2ASS_A 2AST_B 2AVU_D 2AVU_F 2AW2_A 2AXW_B 2AZE_A 2AZE_B 2B2K_B 2B3D_A 2B3S_A 2B4J_C 2B5F_A 2B5L_C 2B81_B 2B8W_B 2B99_B 2B9Z_B 2BA0_B 2BAY_E 2BE1_A 2BEX_D 2BGC_F 2BGW_A 2BM8_H 2BOL_A 2BQZ_A 2BSJ_A 2BTF_P 2BUJ_A 2BYC_A 2BYK_A 2BYK_B 2BZN_H 2C0L_B 2C1L_A 2C1W_B 2C2I_A 2C2L_D 2C2X_A 2C35_D 2C37_T 2C41_H 2C57_A 2C5J_B 2C7M_A 2C9P_A 2C9T_F 2CAY_A 2CB2_B 2CH8_A 2CJR_A 2CJS_A 2CJS_C 2CLB_A 2CLY_D 2CLY_E 2CN4_A 2CO5_B 2CO6_A 2CO6_B 2CS7_A 2CT9_B 2CW6_C 2CWO_B 2CZV_B 2CZV_D 2D00_F 2D13_B 2D1P_G 2D2A_A 2D42_B 2D4C_B 2D4U_A 2D8D_B 2DB4_B 2DB7_A 2DCN_G 2DD4_C 2DD5_J 2DDK_A 2DDM_B 2DDZ_B 2DE5_E 2DI3_A 2DJF_A 2DLB_B 2DM9_B 2DOI_X 2DPF_D 2DPP_B 2DSP_B 2DT5_B 2DUM_C 2DUP_A 2DVT_A 2DWN_C 2DX7_B 2DXB_H 2DYM_G 2E0N_B 2E1M_A 2E1M_B 2E1M_C 2E2K_C 2E4M_A 2E4M_C 2E6F_A 2E7S_G 2E85_B 2E9D_A 2E9X_E 2E9X_G 2EAY_B 2EBY_A 2ED6_G 2EF7_A 2EF8_A 2EFD_A 2EIL_F 2EJ0_B 2EJG_B 2EJG_D 2EJN_A 2EK5_A 2EKD_C 2EKY_B 2EQ5_A 2ERJ_A 2ERJ_G 2ERJ_H 2ES4_A 2ES4_E 2ETE_A 2EVV_C 2EWN_A 2F07_A 2F08_C 2F1V_B 2F22_B 2F2A_C 2F2E_A 2F2F_B 2F2F_C 2F2T_A 2F3T_F 2F4E_A 2F4L_C 2F4M_B 2F4P_A 2F5I_B 2F6L_A 2F6U_A 2F8B_A 2F9I_C 2F9I_D 2F9W_B 2F9Z_A 2F9Z_C 2FBE_C 2FBK_B 2FDB_M 2FDO_A 2FEL_F 2FEW_A 2FEW_B 2FG6_E 2FG8_D 2FHJ_A 2FHX_B 2FJC_H 2FKB_C 2FKD_G 2FKW_O 2FLF_F 2FMY_C 2FNP_A 2FPE_B 2FPW_B 2FQM_E 2FS5_B 2FSY_E 2FTX_A 2FTX_B 2FU5_A 2FUR_A 2FXA_B 2FYI_A 2FZV_B 2G2U_A 2G2U_B 2G38_C 2G38_D 2G3K_D 2G3O_C 2G42_A 2G45_A 2G5C_B 2G76_A 2G77_A 2G84_A 2G9W_B 2GA0_C 2GAF_A 2GAN_A 2GEC_B 2GED_A 2GEF_B 2GHW_C 2GIA_B 2GIA_G 2GJ3_B 2GJV_D 2GL0_B 2GLZ_A 2GM3_D 2GMY_B 2GN8_B 2GO7_A 2GQS_B 2GS9_A 2GSV_B 2GT2_A 2GTY_B 2GUH_A 2GUZ_I 2GUZ_J 2GV5_C 2GXF_A 2GYQ_A 2GZ4_A 2H19_A 2H1T_A 2H3H_A 2H4O_B 2H5N_A 2H6B_A 2H6L_C 2H7V_C 2H9B_B 2H9E_C 2H9G_R 2HA9_B 2HAY_D 2HBV_A 2HCR_B 2HD0_I 2HDW_A 2HEG_A 2HEK_A 2HET_A 2HEY_G 2HFJ_A 2HIN_A 2HJ1_B 2HJ9_C 2HL3_A 2HLE_A 2HLZ_D 2HQL_A 2HRK_A 2HRK_B 2HRV_A 2HSN_A 2HTB_D 2HTH_B 2HU2_A 2HVW_B 2HWJ_A 2HWW_A 2HXI_B 2HXO_B 2HZB_A 2HZM_G 2HZS_F 2I04_A 2I0B_B 2I10_B 2I14_C 2I15_A 2I1A_D 2I2O_A 2I2R_D 2I33_A 2I5B_A 2I5G_A 2I79_B 2I7R_B 2I8D_A 2I9F_D 2I9L_L 2IA2_A 2IA9_B 2IAB_A 2IAZ_B 2IBD_A 2IBG_B 2IDE_C 2IDO_A 2IDO_B 2IGA_A 2IHS_A 2IHW_A 2IJ0_B 2IMH_A 2INP_C 2INU_C 2IOU_D 2IPH_A 2ISJ_C 2IU9_A 2IUO_I 2IV9_A 2IW5_B 2IWP_B 2IX2_B 2IY1_A 2IYB_A 2IZ5_B 2IZZ_B 2J0Q_I 2J28_Q 2J28_R 2J4E_F 2J4L_F 2J59_M 2J6R_A 2J6Y_A 2J7P_A 2J7P_D 2J7Q_C 2J88_A 2JAQ_A 2JCD_A 2JG8_D 2JGZ_B 2JI1_D 2JJ7_B 2JJS_B 2JKI_S 2JL4_B 2JLM_D 2JOD_A 2JW1_A 2JZ0_A 2K2S_A 2K2S_B 2K42_A 2K7I_B 2K7L_A 2KA4_B 2KHM_B 2KLH_B 2KSP_A 2L0I_A 2L0T_B 2L14_A 2L1C_A 2L9S_B 2LAG_A 2LAG_B 2LBU_D 2LD7_A 2LD7_B 2LFH_B 2LFS_A 2LFW_A 2LFW_B 2LKM_B 2LOX_A 2LP4_A 2LPB_A 2LQH_B 2LUH_A 2LUH_B 2LVO_C 2LXM_A 2LY4_A 2M0G_A 2M5B_A 2MEV_1 2MJ5_B 2MP0_A 2MTA_A 2MV7_A 2MWS_B 2N01_B 2N1D_A 2N2H_B 2N73_A 2N73_B 2NBV_A 2NBV_B 2NN3_D 2NNN_B 2NNW_B 2NP5_B 2NR5_C 2NUD_B 2NUU_L 2NUX_B 2NV2_V 2NV4_A 2NVM_B 2NX4_A 2NXM_B 2NXN_B 2NYI_A 2NYX_D 2NYZ_AB 2NZ7_B 2O0Y_C 2O20_B 2O38_B 2O3A_B 2O3B_A 2O3B_B 2O42_A 2O4M_B 2O74_F 2O8G_J 2O8Q_B 2O8V_A 2O95_A 2O9A_C 2OB9_A 2OCF_A 2OD6_A 2ODM_B 2OFY_A 2OGF_D 2OGX_B 2OH1_D 2OIE_C 2OKF_A 2OKI_A 2OKQ_A 2OKU_A 2OL5_B 2OMX_B 2OND_A 2OOJ_B 2OOR_C 2OPD_B 2OPI_B 2OQ2_B 2OQM_A 2OR0_B 2OS5_D 2OS9_B 2OSZ_C 2OT3_A 2OTP_B 2OTX_A 2OU5_B 2OUL_A 2OUW_B 2OV9_C 2OVI_A 2OX7_A 2OYA_A 2OYY_A 2OZ4_A 2OZA_A 2OZN_A 2OZN_B 2P04_A 2P06_B 2P0S_A 2P10_B 2P1J_B 2P22_A 2P22_C 2P2C_L 2P35_A 2P4W_B 2P4Z_B 2P5R_A 2P5X_A 2P62_A 2P6I_B 2P8I_A 2P9L_D 2P9L_F 2PC6_C 2PCC_A 2PCC_B 2PD1_D 2PDO_D 2PF4_E 2PG1_G 2PG4_A 2PGC_D 2PHD_A 2PHN_B 2PIF_B 2PIH_B 2PJS_A 2PJU_D 2PJW_H 2PJW_V 2PLA_A 2PLG_A 2PLR_A 2PM7_C 2PMS_C 2PMV_A 2PNH_A 2PO2_B 2PPY_F 2PQA_A 2PQA_B 2PQN_A 2PQV_B 2PRO_B 2PRU_B 2PTF_B 2PTT_A 2PTT_B 2PUK_E 2PUL_A 2PV2_C 2PV7_B 2PZD_B 2PZH_A 2PZK_A 2Q03_A 2Q05_A 2Q0O_B 2Q0O_C 2Q0T_A 2Q0X_A 2Q17_B 2Q3F_A 2Q5E_E 2Q73_A 2Q7F_B 2Q7N_B 2Q81_A 2Q87_C 2Q97_T 2QA7_C 2QAZ_C 2QBW_A 2QD0_B 2QE9_A 2QFA_A 2QFA_B 2QGQ_G 2QGX_C 2QH1_B 2QH9_A 2QIW_A 2QIY_B 2QJA_D 2QJV_B 2QJW_A 2QKM_E 2QKM_F 2QKO_B 2QKP_A 2QL2_A 2QL2_B 2QL3_J 2QLC_C 2QLP_A 2QLZ_B 2QNF_A 2QNU_B 2QQ1_A 2QQZ_A 2QRD_B 2QRD_G 2QRE_A 2QTQ_A 2QV0_B 2QV6_A 2QW7_H 2QYI_D 2QYP_B 2R19_B 2R1F_B 2R25_A 2R2C_A 2R47_B 2R4I_A 2R56_A 2R5O_A 2R6A_C 2R6O_A 2R6U_D 2R78_C 2R9E_A 2RA6_C 2RAF_B 2RAS_B 2RB9_D 2RBB_A 2RBD_A 2RCC_A 2RD7_A 2RD7_C 2RD9_A 2RDC_B 2RDM_C 2RG7_B 2RGN_B 2RH0_A 2RHK_C 2RHS_C 2RJZ_A 2RK0_A 2RK9_B 2RL7_D 2RP4_C 2RVB_B 2SPC_A 2UTG_B 2UUY_B 2UV1_B 2UVP_B 2UX9_F 2UZ3_C 2UZC_A 2V0O_A 2V0R_A 2V0X_B 2V3B_B 2V4I_G 2V4I_H 2V57_B 2V5H_D 2V5Q_A 2V6B_C 2V8S_V 2V8U_B 2V92_B 2VAX_G 2VDB_B 2VDW_E 2VDW_F 2VE6_A 2VE7_B 2VE7_D 2VEE_A 2VEF_A 2VER_A 2VFX_C 2VGL_S 2VIF_A 2VJF_C 2VKO_A 2VLG_D 2VLQ_B 2VMB_A 2VOH_A 2VPV_A 2VQA_A 2VRC_B 2VRN_B 2VSG_A 2VT3_B 2VUB_A 2VUC_B 2VVX_A 2VX8_B 2VXB_A 2VXQ_A 2VZD_A 2W01_A 2W0C_C 2W1T_A 2W2B_B 2W2U_B 2W2W_A 2W4L_E 2W4S_C 2W69_A 2W6H_G 2W6H_H 2W80_D 2W84_A 2W8B_H 2W8M_B 2W9S_D 2WAM_A 2WB1_S 2WBT_A 2WD5_A 2WD5_B 2WFF_1 2WFF_3 2WFL_A 2WG3_A 2WG5_B 2WH6_A 2WIU_D 2WIV_B 2WJ0_A 2WJ8_D 2WJV_D 2WKW_A 2WL8_A 2WLG_C 2WMM_A 2WO3_B 2WQ4_A 2WQZ_D 2WSU_B 2WTE_A 2WTH_B 2WUK_A 2WUS_R 2WVE_B 2WWB_B 2WWK_O 2WWK_T 2WY3_B 2WY8_Q 2WYE_A 2WZP_B 2X0G_A 2X17_L 2X1X_E 2X1X_R 2X36_C 2X3B_A 2X3F_B 2X3Y_E 2X4I_A 2X53_W 2X5H_D 2X5Q_A 2X6T_B 2X7X_A 2X8K_B 2X9A_A 2X9A_D 2X9Q_A 2XCM_F 2XED_A 2XFG_B 2XFV_A 2XGF_C 2XGY_A 2XIU_A 2XPP_A 2XQN_T 2XRA_A 2XRN_B 2XSC_E 2XSN_B 2XSO_H 2XTS_C 2XUM_A 2XVC_A 2XVT_F 2XWG_B 2XWQ_C 2XWX_A 2XYK_B 2XYR_A 2XYR_B 2XZ9_A 2XZE_B 2Y1H_B 2Y32_B 2Y3D_A 2Y3M_B 2Y79_A 2Y7R_G 2Y8Q_A 2Y8T_D 2Y96_A 2Y9M_B 2Y9X_B 2Y9X_F 2YC2_A 2YC2_D 2YF3_D 2YGD_D 2YGG_A 2YH9_C 2YIL_C 2YJE_M 2YJN_B 2YLE_A 2YM9_C 2YVE_A 2YVL_B 2YVS_B 2YWM_A 2YXO_B 2YY7_A 2YYS_A 2YYV_B 2YZE_C 2YZJ_A 2YZR_B 2YZS_B 2Z0E_A 2Z0L_H 2Z0P_D 2Z0T_C 2Z29_A 2Z2L_A 2Z2L_B 2Z2M_C 2Z2R_A 2Z2S_A 2Z2S_B 2Z3F_E 2Z3J_A 2Z3N_B 2Z3Q_B 2Z3R_G 2Z58_B 2Z5C_D 2Z5C_E 2Z6E_D 2Z6J_B 2Z7E_A 2Z8I_C 2Z8I_D 2Z8M_B 2Z9O_A 2ZAE_C 2ZAE_D 2ZB9_A 2ZBC_F 2ZC6_D 2ZCN_A 2ZEJ_B 2ZET_C 2ZF3_A 2ZFD_A 2ZFD_B 2ZFW_E 2ZG6_B 2ZGI_D 2ZIH_A 2ZJD_C 2ZME_A 2ZME_B 2ZME_C 2ZMV_B 2ZNJ_B 2ZNZ_B 2ZQK_M 2ZRT_C 2ZSI_A 2ZSI_B 2ZSU_A 2ZUQ_A 2ZV3_B 2ZVY_A 2ZW3_E 2ZXW_U 2ZXX_E 2ZXX_F 2ZYZ_A 2ZYZ_B 3A17_F 3A1M_E 3A1P_C 3A1P_D 3A1Y_C 3A1Y_G 3A2N_F 3A2W_J 3A4S_D 3A5I_A 3A6M_A 3A7O_D 3A8I_A 3A98_C 3A98_D 3AAA_AB 3AAA_C 3AAD_A 3AB0_A 3ABD_B 3ABK_C 3ABK_W 3AD8_D 3AE8_B 3AE8_C 3AEH_B 3AFK_A 3AFQ_D 3AG3_G 3AGF_A 3AGY_B 3AHS_A 3AJ1_C 3AJB_A 3AJF_A 3AJY_A 3AL3_A 3ALP_B 3ALZ_B 3ANS_B 3AO0_B 3AON_A 3AON_B 3APY_A 3AQJ_R 3AQQ_B 3ASO_B 3ASO_I 3AXG_H 3AXJ_A 3AXJ_B 3AXY_B 3AXY_D 3AYH_A 3AYH_B 3AYZ_B 3B01_A 3B08_B 3B1B_B 3B42_B 3B48_B 3B4Y_A 3B5K_B 3B6A_A 3B6P_D 3B83_G 3B8I_F 3B9I_B 3B9K_F 3BA3_B 3BAL_B 3BAR_A 3BB9_C 3BCW_B 3BDB_B 3BE6_A 3BEG_A 3BEG_B 3BEY_D 3BFW_C 3BG2_B 3BH3_B 3BHD_A 3BHQ_A 3BJ6_A 3BJB_B 3BJD_B 3BK3_C 3BL4_A 3BL5_C 3BLH_B 3BM2_B 3BN3_B 3BNV_E 3BNW_A 3BP8_D 3BPD_F 3BPJ_B 3BPQ_B 3BPZ_B 3BQA_B 3BQB_X 3BRC_B 3BRJ_D 3BRT_D 3BRW_B 3BS5_A 3BS5_B 3BT3_B 3BTI_A 3BTP_A 3BU2_C 3BUA_D 3BWG_B 3BWL_D 3BWU_D 3BWV_B 3BX7_C 3BXJ_B 3BYW_F 3BZO_B 3C18_A 3C1D_B 3C1L_F 3C24_A 3C3W_A 3C5O_B 3C5W_P 3C5Y_J 3C6M_C 3C85_A 3C8I_B 3C9A_B 3C9G_A 3CAE_G 3CAZ_B 3CBX_A 3CEW_D 3CF4_G 3CFI_A 3CFI_B 3CG0_A 3CG8_B 3CGY_A 3CI0_J 3CI0_K 3CI6_B 3CIT_A 3CJD_A 3CJH_F 3CJH_I 3CJI_C 3CJL_A 3CJX_H 3CKD_C 3CKY_A 3CMB_D 3CNH_A 3CNY_B 3CO2_D 3CQ9_C 3CQC_A 3CQC_B 3CQZ_C 3CRC_A 3CSW_C 3CSY_M 3CT6_A 3CTM_D 3CUE_O 3CVJ_A 3CW2_M 3CX5_E 3CYQ_F 3D03_C 3D0F_A 3D0T_D 3D0W_A 3D12_B 3D1E_A 3D1L_B 3D1M_D 3D36_B 3D3K_A 3D3N_B 3D4I_D 3D4R_A 3D54_D 3D5N_H 3D5S_C 3D6R_B 3D72_B 3D7J_E 3D87_A 3D87_B 3D8A_G 3D8U_B 3D9R_C 3D9X_C 3DAL_A 3DAW_B 3DB0_B 3DBI_A 3DBO_B 3DCA_C 3DCL_A 3DDC_B 3DDH_A 3DDV_B 3DFE_A 3DFZ_B 3DGC_L 3DGC_R 3DGE_B 3DGP_A 3DGP_B 3DH7_C 3DI2_B 3DI3_A 3DI4_A 3DKB_D 3DKU_A 3DKW_I 3DL2_A 3DMC_B 3DN7_B 3DNH_A 3DNM_A 3DO8_A 3DOF_A 3DOF_B 3DP3_B 3DPI_A 3DPO_B 3DPY_A 3DRX_C 3DSB_B 3DSN_B 3DTN_A 3DTO_C 3DTP_F 3DTT_B 3DUK_B 3DVP_B 3DWG_C 3DXB_G 3DXD_A 3DZ2_B 3DZA_D 3DZM_A 3E05_B 3E08_D 3E0J_D 3E17_A 3E19_A 3E1Z_A 3E48_B 3E4C_A 3E6M_D 3E7L_A 3E96_B 3E98_A 3EAB_A 3EAS_B 3EBA_B 3ECS_H 3EDP_A 3EEY_B 3EF2_B 3EFY_A 3EFZ_B 3EG5_B 3EGH_C 3EGR_A 3EGV_A 3EH4_B 3EJH_A 3EJO_A 3ELV_A 3EMJ_K 3EMO_C 3EN0_A 3ENT_A 3EO8_C 3EPY_A 3EPZ_A 3EQX_A 3ER6_F 3ERW_B 3ES5_A 3ESK_A 3EUH_B 3EUH_E 3EUK_E 3EUS_A 3EVY_B 3EZ0_A 3EZJ_C 3EZQ_C 3EZQ_D 3F0N_A 3F1I_H 3F1I_S 3F1P_A 3F1P_B 3F3S_A 3F4N_F 3F51_D 3F62_A 3F6O_A 3F7P_C 3F8F_A 3F8H_A 3F8U_B 3F8X_D 3F90_F 3FA4_G 3FA9_B 3FAU_B 3FBN_D 3FBZ_C 3FCG_A 3FD4_B 3FDS_A 3FDS_C 3FF8_D 3FFK_D 3FFU_B 3FG8_C 3FG9_E 3FGT_A 3FIL_B 3FJG_D 3FJS_C 3FJU_B 3FK9_A 3FKF_A 3FKH_B 3FLD_B 3FLO_F 3FLP_N 3FMA_C 3FMB_A 3FMT_A 3FN1_B 3FN2_A 3FOK_H 3FPU_A 3FPV_A 3FQ6_B 3FRW_B 3FRY_A 3FSH_A 3FUY_B 3FVM_B 3FWC_N 3FWE_B 3FWS_B 3FXA_A 3FXD_B 3FXT_B 3FY6_A 3FYB_A 3FYF_B 3G13_A 3G16_A 3G2E_B 3G2O_A 3G33_B 3G3B_A 3G3R_A 3G3Z_B 3G5W_E 3G67_A 3G7K_B 3G8L_A 3G9K_L 3G9W_A 3GAA_A 3GAG_D 3GAS_C 3GBU_D 3GC3_A 3GDH_A 3GFD_A 3GFK_A 3GFK_B 3GFU_A 3GGJ_A 3GIF_A 3GJB_B 3GJO_C 3GLC_A 3GNI_A 3GNI_B 3GNJ_C 3GOR_C 3GOX_A 3GPG_C 3GQH_A 3GQI_B 3GSD_K 3GTY_S 3GU3_B 3GUY_H 3GVI_A 3GWH_B 3GWL_A 3GWN_B 3GWR_B 3GXG_C 3GXW_D 3GXY_A 3GYD_B 3GZ1_A 3GZ8_B 3GZE_C 3GZR_A 3H05_B 3H11_A 3H2U_A 3H2U_B 3H35_C 3H3M_A 3H4S_E 3H6K_C 3H6S_E 3H87_A 3H87_D 3H8D_B 3H90_D 3HA4_A 3HB1_C 3HCG_A 3HCS_A 3HDJ_A 3HEF_B 3HF5_A 3HG9_B 3HH0_B 3HHH_B 3HHI_B 3HI2_A 3HI2_B 3HIE_C 3HIM_B 3HJ9_A 3HJP_D 3HJU_A 3HKL_B 3HL4_B 3HL6_B 3HL9_B 3HMX_AB 3HN6_B 3HO7_A 3HPK_A 3HQI_A 3HQR_A 3HR7_B 3HRQ_B 3HS3_A 3HSE_B 3HSH_F 3HT2_A 3HTA_A 3HTR_A 3HTU_C 3HUG_O 3HUG_P 3HWP_B 3HY2_Y 3HZ4_A 3HZO_A 3I2B_E 3I38_A 3I54_A 3I5V_A 3I6P_E 3I71_B 3I7U_C 3I9S_C 3I9V_E 3I9V_G 3IA0_I 3IA3_A 3IA8_B 3IAI_A 3IB6_B 3IBM_B 3IC3_C 3IC5_B 3IDF_A 3IEC_B 3IF4_D 3IF8_B 3IFQ_C 3IGM_B 3IIC_B 3IIF_A 3IJ6_D 3IJM_A 3IKK_A 3IMO_D 3IMQ_C 3IN6_A 3IOY_A 3IQ2_B 3IR1_C 3IRB_A 3ISA_D 3ISM_B 3IUW_B 3IVP_A 3IX7_A 3IX8_D 3IXE_A 3IXE_B 3IXS_A 3JRV_A 3JSJ_B 3JVC_A 3JX9_A 3JXO_B 3K0Z_B 3K1I_B 3K1I_C 3K1R_A 3K25_B 3K33_A 3K3C_B 3K4G_C 3K4W_D 3K4Y_A 3K53_A 3K67_A 3K6C_C 3K6E_B 3K6G_A 3K6Q_C 3K6T_C 3K75_B 3K75_D 3K8P_C 3KAE_B 3KAS_B 3KB4_D 3KBO_D 3KBT_A 3KBT_D 3KCP_A 3KCP_B 3KCV_I 3KDG_A 3KDQ_C 3KE2_A 3KG8_A 3KG9_A 3KH1_A 3KH2_E 3KH8_A 3KIH_B 3KIK_A 3KIN_D 3KJ0_A 3KK4_A 3KKD_C 3KLQ_A 3KLS_X 3KMH_B 3KML_G 3KMT_B 3KNW_A 3KOC_F 3KP1_H 3KS7_D 3KTC_B 3KTM_F 3KTS_E 3KU4_D 3KUC_B 3KVZ_A 3KW0_B 3KWV_F 3KXE_A 3KXE_C 3KXY_B 3KXY_T 3KY8_A 3KYG_B 3KYJ_A 3KYS_C 3KZ1_A 3KZH_A 3KZI_D 3KZI_E 3KZQ_A 3L09_B 3L0I_C 3L0R_A 3L0W_B 3L2H_A 3L34_G 3L6Y_A 3L7T_C 3L82_A 3L82_B 3L89_M 3L9F_C 3L9J_C 3L9K_C 3LA6_I 3LA7_A 3LAO_B 3LB6_A 3LB6_C 3LB8_C 3LBX_A 3LBX_B 3LD8_A 3LFK_A 3LFR_B 3LG2_B 3LGA_B 3LGS_C 3LH2_V 3LHX_A 3LIS_B 3LIZ_A 3LJL_A 3LK4_7 3LKU_F 3LLK_B 3LLM_B 3LMS_B 3LNL_B 3LNN_A 3LO3_O 3LOR_B 3LOT_D 3LP6_B 3LQ6_B 3LQV_B 3LR2_B 3LRJ_D 3LRQ_D 3LRU_A 3LSJ_A 3LTE_D 3LUB_I 3LVK_B 3LVY_C 3LW7_B 3LWF_B 3LYH_B 3LYQ_B 3LYV_C 3M0Z_D 3M1A_D 3M1C_B 3M1R_A 3M2V_F 3M3R_D 3M4W_A 3M5O_A 3M65_A 3M6N_B 3M85_B 3M8A_L 3M8E_A 3M8J_A 3M8N_D 3M92_B 3MAL_A 3MDO_A 3ME4_A 3MES_B 3MEX_A 3MF0_A 3MF1_A 3MGX_B 3MHF_D 3MHH_E 3MIL_A 3MJ7_A 3MJ7_B 3MJK_Y 3MJO_A 3MJQ_A 3MK7_B 3MK7_I 3MKQ_F 3MKR_B 3MLG_A 3MMY_F 3MOQ_C 3MPO_B 3MQ0_B 3MQH_A 3MQW_D 3MR7_A 3MTS_B 3MVP_A 3MXN_A 3MXN_B 3MZK_B 3MZO_B 3N06_A 3N06_B 3N10_B 3N2L_E 3N2S_C 3N40_F 3N4P_B 3N4S_B 3N50_F 3N7R_B 3N7R_C 3N9X_B 3NAP_B 3NAU_B 3NCT_D 3NDH_A 3NE2_A 3NEK_B 3NFC_E 3NFG_G 3NFG_H 3NGF_B 3NGZ_A 3NHV_B 3NI7_A 3NIC_C 3NJ2_B 3NJA_B 3NJC_A 3NJH_D 3NK3_A 3NKH_B 3NKZ_D 3NM7_A 3NMZ_C 3NN2_B 3NO7_A 3NOQ_B 3NPG_C 3NQN_A 3NQO_A 3NR1_B 3NRJ_A 3NRT_C 3NRV_D 3NS6_B 3NTE_A 3NUT_C 3NWS_D 3NXZ_D 3NYB_A 3NYB_B 3NYM_B 3O0L_A 3O0R_C 3O10_D 3O2I_B 3O34_A 3O5C_A 3O61_B 3O6B_A 3O6Q_A 3O7X_D 3O91_A 3OAK_A 3OCD_C 3OCD_D 3OED_C 3OEU_2 3OEU_M 3OGH_B 3OGI_C 3OGI_D 3OJI_B 3OKJ_D 3OL3_A 3OMT_A 3ON0_A 3ONA_A 3ONA_B 3ONL_A 3OPC_B 3OQ2_B 3OQP_B 3OR1_E 3OR3_A 3OSY_E 3OTE_A 3OUN_A 3OUN_B 3OUO_A 3OWT_A 3OYF_A 3OZB_A 3P01_B 3P0C_A 3P16_A 3P37_A 3P4G_B 3P52_B 3P71_T 3P83_B 3P83_F 3P8B_C 3P8B_D 3P8C_D 3P8C_E 3P8C_F 3P9T_A 3PB2_B 3PC8_A 3PC8_D 3PCC_P 3PCQ_C 3PCQ_D 3PCS_A 3PH0_A 3PH0_C 3PH1_A 3PHF_D 3PIM_B 3PJN_A 3PJS_N 3PJV_D 3PL0_A 3PNR_B 3PNW_U 3PPE_B 3PQK_B 3PQR_A 3PR7_B 3PRB_B 3PRP_A 3PRU_B 3PS4_B 3PUT_B 3PUV_G 3PV6_B 3PVR_A 3PVR_C 3PXX_E 3PYI_B 3Q0V_B 3Q0Y_C 3Q1P_A 3Q4H_A 3Q4H_B 3Q58_A 3Q6A_D 3Q6D_C 3Q7G_A 3Q7H_M 3Q87_A 3Q87_B 3Q9D_A 3Q9U_A 3Q9V_B 3QB2_B 3QBR_A 3QBU_A 3QC8_B 3QFM_A 3QGK_J 3QIS_A 3QIT_D 3QMW_B 3QNA_D 3QNI_A 3QNR_B 3QOE_A 3QP8_D 3QPB_F 3QQ2_B 3QQW_E 3QRF_G 3QTA_A 3QTH_A 3QU2_D 3QVI_B 3QWN_J 3QWU_A 3QYF_A 3QYQ_C 3R1F_B 3R1G_B 3R2J_D 3R3S_C 3R3W_A 3R45_A 3R45_B 3R4D_A 3R4D_B 3R4K_B 3R4Q_D 3R6A_B 3R84_K 3R84_L 3R8K_B 3R8Y_D 3RBB_A 3RBN_A 3RBQ_B 3RBX_B 3RDZ_C 3REP_A 3RF1_A 3RGB_G 3RGF_A 3RGF_B 3RGU_A 3RH7_E 3RHT_B 3RHU_B 3RJR_C 3RKO_K 3RLB_B 3RLQ_B 3RMU_C 3RPF_B 3RPF_C 3RPG_B 3RPG_C 3RRI_B 3RTY_G 3RV0_B 3RV2_A 3RVZ_A 3S19_A 3S1J_A 3S1M_H 3S2D_F 3S5R_A 3S6L_C 3S6N_E 3S6Z_B 3S7R_A 3S8V_X 3S97_A 3S97_C 3S9C_A 3SB1_B 3SC6_C 3SCH_A 3SDL_B 3SDL_C 3SF4_A 3SF5_C 3SF8_A 3SGB_E 3SGQ_I 3SIP_E 3SJA_J 3SJR_A 3SK2_B 3SL7_B 3SLG_C 3SM1_A 3SO5_B 3SPS_A 3SQD_A 3STB_C 3SVR_C 3SWC_B 3SXY_A 3SYN_A 3T1Q_C 3T2N_B 3T30_G 3T38_A 3T3A_A 3T3X_A 3T4N_A 3T6G_A 3T6G_B 3T6O_B 3T88_F 3T91_B 3TAC_B 3TDU_A 3TEO_J 3TG1_B 3TG9_B 3TGN_B 3THA_B 3THT_B 3TIX_A 3TKR_B 3TL3_A 3TL8_A 3TL8_B 3TLF_D 3TMK_F 3TND_B 3TND_E 3TNF_B 3TOS_I 3TOZ_H 3TPU_A 3TQY_A 3TS3_B 3TS8_C 3TSZ_A 3TU3_A 3TUZ_F 3TW8_C 3TXQ_D 3TY6_E 3U02_B 3U0H_A 3U1D_A 3U1J_B 3U1O_A 3U52_E 3U5Z_A 3U61_H 3UBX_A 3UC0_B 3UIN_D 3UKV_B 3UL4_B 3ULA_D 3ULQ_A 3ULQ_B 3UO3_A 3UYO_A 3UZ0_A 3UZ0_B 3UZP_A 3V3K_A 3V3K_B 3V6O_A 3V6Z_F 3VCB_A 3VEP_D 3VG8_F 3VG9_A 3VLB_B 3VYR_A 3W8I_B 3WA5_B 3WDG_B 3WKM_B 3WO3_A 3WO3_B 3WQB_B 3WWN_B 3ZET_A 3ZNZ_A 3ZQP_C 3ZRJ_A 3ZTG_B 3ZUP_B 3ZV0_B 3ZV0_D 3ZVK_G 3ZXQ_B 3ZYJ_B 3ZYL_A 3ZZV_A 4A94_D 4AEI_A 4AP2_B 4APX_A 4AQE_B 4AWX_B 4AYE_A 4B4S_A 4BD9_B 4BFI_A 4BFI_B 4BKX_A 4BPX_C 4BPX_D 4BQD_A 4C2A_A 4C4P_B 4C7N_B 4CAD_I 4CDK_A 4CDK_E 4CJ1_B 4CMM_B 4CNI_C 4CT0_B 4D0N_B 4DBG_A 4DBG_B 4DID_B 4DT1_A 4DT1_B 4DX8_A 4DX8_J 4EQA_A 4EQA_C 4ETW_A 4ETW_B 4EUK_A 4EUK_B 4EXP_A 4F0A_B 4F2M_F 4F37_A 4F38_B 4F48_A 4F48_B 4F9L_A 4FQ0_B 4FQ0_C 4FQJ_A 4G59_C 4G6U_A 4G6V_A 4G6V_B 4G80_T 4GAF_A 4GAM_AFBGCH 4GAM_D 4GEH_A 4GH7_A 4GH7_B 4GI3_C 4GN5_A 4H5S_B 4H88_A 4HC1_B 4HCP_A 4HEP_A 4HT1_T 4HX3_A 4HX3_BD 4I6L_A 4IC7_B 4IU3_A 4IU3_B 4IYP_A 4IZ7_B 4J32_A 4J32_B 4J4P_A 4JCV_E 4JEU_B 4JW3_A 4K1R_A 4K24_A 4K2U_B 4KDI_C 4KFZ_A 4KT3_A 4KVG_B 4LAD_B 4LLO_B 4LU5_A 4LU5_IM 4LW4_C 4M5F_A 4M6B_A 4MI8_A 4MJS_A 4MJS_B 4ML7_B 4MQV_A 4MRT_A 4MRT_C 4MWF_C 4N7Z_A 4NIQ_A 4NL9_A 4NM3_A 4NOO_A 4NOO_B 4NP4_A 4NQW_B 4NZL_B 4NZR_M 4OFY_A 4OII_A 4OKV_E 4ONS_A 4ONS_B 4OVN_F 4OYD_B 4P3Y_B 4PBW_B 4PJ2_A 4PJ2_D 4PLJ_B 4PLO_B 4PW9_A 4PW9_B 4PZ6_A 4Q6I_J 4Q96_D 4QLP_A 4QLP_B 4QRP_L 4QT8_C 4QXA_B 4RDQ_E 4REY_A 4RS1_B 4RWS_C 4RWT_D 4S0S_A 4TQ1_A 4U0Q_B 4U1G_A 4U2X_A 4U4C_B 4UEM_A 4UEM_B 4UF1_A 4UI1_D 4UYQ_B 4V2C_A 4V2C_B 4W6Y_A 4WFF_A 4X33_A 4XAK_A 4XHU_D 4XL1_A 4XLW_B 4XOI_B 4XWJ_A 4XXB_A 4Y5O_A 4Y5O_B 4YH7_B 4YN0_A 4YPI_C 4YVQ_A 4YVQ_C 4YWC_A 4YYP_A 4ZGQ_A 4ZGY_B 4ZI2_C 4ZII_A 4ZLT_B 4ZQU_B 4ZRJ_B 4ZRP_C 4ZSO_E 5ABV_B 5AJJ_A 5AYS_A 5B64_A 5B64_B 5B76_A 5BNQ_A 5C8J_I 5CTR_A 5CTR_C 5CZF_D 5CZX_A 5D1L_B 5D1Q_E 5D1Z_I 5D8J_A 5D93_A 5DCQ_F 5DFW_A 5DHV_N 5DJT_B 5DJU_A 5DOB_A 5DOB_B 5E8E_BA 5E94_G 5EB1_A 5EB1_B 5EE5_A 5EO9_B 5ESV_E 5ET1_A 5F3X_B 5F4E_A 5F4E_B 5F5S_A 5F5S_B 5FB8_C 5FZT_A 5GPG_B 5H35_E 5HBT_B 5HDQ_A 5HPY_A 5IKC_M 5IMT_D 5IP4_E 5IUS_A 5IUS_C 5J13_A 5J4A_A 5J4A_B 5JLV_C 5JQ6_A 5K59_A 5KTE_A 5LSP_P 5LWY_A 5LXQ_A 5MO9_X 5SY8_O 5SZJ_B 5TAR_A 5TAR_B 5TUD_A 5VEB_X 5W2B_A 5XBM_C 5YOY_C 6BPE_D 6CK9_B 6CYF_Q 6ELU_D ================================================ FILE: lists/training_ppi.txt ================================================ 1A0G_A_B 1A0H_E_D 1A14_HL_N 1A1U_A_C 1A22_A_B 1A2A_C_D 1A2X_A_B 1A2Y_BA_C 1A3R_H_P 1A6D_A_B 1A6J_A_B 1A73_A_B 1AA7_A_B 1ADQ_HL_A 1ADY_C_D 1AFV_KM_B 1AHW_AB_C 1AIH_C_D 1AKJ_AB_DE 1AOR_A_B 1APY_C_B 1APZ_B_D 1ASY_A_B 1AUI_A_B 1AVA_A_C 1AVF_A_P 1AVO_K_L 1AVZ_B_C 1AX4_B_D 1AXC_A_B 1AXI_A_B 1AZ4_A_B 1AZS_AB_C 1AZZ_A_D 1B0N_A_B 1B35_C_B 1B47_A_B 1B4K_A_B 1B4U_C_D 1B5F_A_B 1B65_B_D 1B8A_A_B 1B9L_C_D 1B9M_A_B 1B9Y_A_C 1BBH_A_B 1BC5_A_T 1BCP_H_L 1BCR_A_B 1BDF_C_D 1BGX_HL_T 1BHM_A_B 1BHW_A_C 1BIH_A_B 1BJ1_HL_VW 1BJ1_K_V 1BJA_A_B 1BK6_B_E 1BKD_R_S 1BO6_A_B 1BOU_B_D 1BPL_A_B 1BR1_C_D 1BUH_A_B 1BVK_DE_F 1BVN_P_T 1BVP_3_2 1C28_C_B 1C3C_A_B 1C7N_C_D 1C8O_A_B 1C8U_A_B 1CB7_B_D 1CDC_A_B 1CF4_A_B 1CF7_A_B 1CFF_A_B 1CHM_A_B 1CJ1_G_H 1CL7_H_L 1CLI_A_B 1CLV_A_I 1CMV_A_B 1CN3_E_D 1CN4_C_B 1COZ_A_B 1CP2_A_B 1CQI_A_B 1CRX_A_B 1CS0_A_B 1CSG_A_B 1CTA_A_B 1CX8_G_F 1CZ8_YX_V 1D02_A_B 1D1J_B_D 1D2Z_A_B 1D3Y_A_B 1D4X_A_G 1D8H_A_B 1D9E_A_B 1D9G_A_B 1DBQ_A_B 1DBW_A_B 1DC1_A_B 1DD1_A_B 1DDJ_A_B 1DDZ_A_B 1DE4_AB_CF 1DE4_A_C 1DE4_C_F 1DE5_A_B 1DE7_B_K 1DEE_A_B 1DEE_G_H 1DGB_B_D 1DGR_W_V 1DHG_A_B 1DHK_A_B 1DJ8_A_B 1DK4_A_B 1DLT_A_B 1DM5_E_F 1DM9_A_B 1DNW_B_D 1DOH_A_B 1DOS_A_B 1DP5_A_B 1DPJ_A_B 1DQJ_AB_C 1DQN_A_B 1DS8_M_L 1DSX_E_H 1DVF_B_D 1DXX_C_D 1DZB_A_X 1E0J_A_B 1E0U_C_D 1E1H_A_B 1E3U_A_C 1E44_A_B 1E4K_AB_C 1E6E_A_B 1E6J_HL_P 1E6V_B_E 1E8F_A_B 1E96_A_B 1E9I_A_B 1EBD_A_B 1EBO_D_F 1EC5_C_B 1ECI_A_B 1EER_A_BC 1EER_A_B 1EES_A_B 1EEX_A_G 1EEX_A_L 1EF1_B_D 1EF8_A_B 1EFN_B_A 1EFV_A_B 1EGH_A_B 1EGH_A_F 1EGJ_HL_A 1EHI_A_B 1EHK_A_C 1EI1_A_B 1EJW_A_C 1EK6_A_B 1EL6_A_C 1EM1_A_B 1EMU_A_B 1EMV_A_B 1EO3_A_B 1EO8_HL_A 1ES0_A_B 1ESM_C_D 1ETE_C_D 1EV7_A_B 1EXB_ABDC_EGFH 1EZ1_A_B 1F06_A_B 1F0V_C_D 1F15_A_B 1F23_C_B 1F28_A_B 1F34_A_B 1F36_A_B 1F3M_B_D 1F3R_A_B 1F3T_A_B 1F3U_G_H 1F3V_A_B 1F3X_G_H 1F4J_B_D 1F51_AB_E 1F5M_A_B 1F5T_A_B 1F5Z_C_B 1F6M_A_C 1F8M_C_D 1F8Y_A_B 1F9Z_A_B 1FAK_HL_T 1FB1_A_E 1FBI_HL_X 1FBV_A_C 1FC2_C_D 1FCD_B_D 1FD4_K_L 1FE8_HL_A 1FFW_A_B 1FJ1_DC_E 1FK8_A_B 1FLC_E_F 1FLE_I_E 1FMO_E_I 1FNE_C_D 1FNS_HL_A 1FOD_1_2 1FQ1_A_B 1FQJ_A_B 1FQJ_A_C 1FR8_A_B 1FS0_E_G 1FS1_C_D 1FSK_BC_A 1FSK_D_F 1FT8_C_B 1FT9_A_B 1FUI_D_F 1FUJ_C_B 1FWG_C_B 1FYF_A_B 1FYH_A_B 1FZ0_A_C 1FZ0_A_E 1FZR_C_D 1FZW_A_B 1G09_A_B 1G0S_A_B 1G0U_1_Z 1G0V_A_B 1G21_B_D 1G3I_G_M 1G3J_A_B 1G3J_C_D 1G5C_A_B 1G5G_D_F 1G5H_A_B 1G64_A_B 1G6Q_5_6 1G6U_A_B 1G6V_A_K 1G6W_C_D 1G8K_A_B 1G8M_A_B 1G8R_A_B 1G8Y_G_H 1G9M_HL_G 1GCQ_B_C 1GDT_A_B 1GG2_A_B 1GGM_A_B 1GH7_A_B 1GHQ_A_B 1GK0_C_D 1GK2_B_D 1GK9_A_B 1GLA_G_F 1GLC_G_F 1GMW_B_D 1GN4_B_D 1GNG_A_X 1GP2_A_BG 1GPQ_A_B 1GPW_A_B 1GQA_A_D 1GQG_B_D 1GQM_K_L 1GQY_A_B 1GRC_A_B 1GRI_A_B 1GRN_A_B 1GU9_G_H 1GUA_A_B 1GUQ_A_B 1GVM_E_F 1GX7_A_D 1GXJ_A_B 1GY7_C_D 1GYL_A_B 1GYY_A_B 1GZ3_A_B 1GZS_A_B 1H0D_BA_C 1H0H_K_L 1H0T_A_B 1H18_A_B 1H21_C_D 1H2I_O_P 1H2M_A_S 1H2S_A_B 1H2U_B_Y 1H3L_A_B 1H59_A_B 1H6D_A_C 1H6K_B_Y 1H6W_A_B 1H74_A_B 1H81_A_B 1H9D_A_B 1HBM_A_E 1HBN_A_D 1HBU_D_F 1HE1_B_D 1HE1_C_A 1HE8_B_A 1HF2_C_D 1HI9_E_D 1HJR_B_D 1HKQ_A_B 1HN2_A_B 1HR6_E_F 1HSA_A_C 1HSJ_A_B 1HT9_A_B 1HV2_A_B 1HWG_C_B 1HWL_A_B 1HXH_A_D 1HXM_C_D 1I1A_A_C 1I1D_C_B 1I2M_A_B 1I3O_D_F 1I4D_D_AB 1I50_B_J 1I6O_A_B 1I78_A_B 1I7Q_C_D 1I7W_C_D 1I7X_A_B 1I7X_C_D 1I8L_A_C 1I9R_HL_ABC 1IAH_A_B 1IAO_A_B 1IAR_A_B 1IB1_AB_E 1IBR_A_B 1IC5_Y_H 1IHM_A_C 1IHM_C_B 1IHR_A_B 1II2_A_B 1II8_A_B 1IIE_C_B 1IJF_A_B 1IJK_A_BC 1IJL_A_B 1IK9_A_C 1IQ5_A_B 1IQ6_A_B 1IQD_AB_C 1IQP_C_F 1IR2_7_Y 1IRA_Y_X 1IS7_Q_R 1IS8_D_G 1ISG_A_B 1ISS_A_B 1IT8_A_B 1IUG_A_B 1IVO_A_B 1IVO_B_D 1IWA_F_I 1IWQ_A_B 1IXQ_B_D 1IXS_A_B 1IY9_A_B 1IZ1_A_B 1J0E_A_B 1J1D_A_C 1J1E_A_C 1J2J_A_B 1J2U_A_F 1J2U_C_D 1J2W_B_D 1J31_C_D 1J3K_B_D 1J3L_A_C 1J4V_A_B 1J70_A_B 1J7D_A_B 1J7V_L_R 1J9I_A_B 1JAY_A_B 1JB7_A_B 1JD6_A_B 1JFI_C_B 1JFQ_H_L 1JG8_B_D 1JH4_A_B 1JHL_HL_A 1JJO_B_D 1JKV_C_D 1JMA_A_B 1JMO_A_HL 1JMT_A_B 1JMU_B_F 1JMV_A_B 1JN9_C_D 1JNB_G_F 1JNY_A_B 1JNZ_A_B 1JPS_HL_T 1JPY_X_Y 1JR3_E_D 1JRA_C_D 1JRH_HL_I 1JS3_A_B 1JSU_C_B 1JTG_B_A 1JTO_B_M 1JWH_CD_A 1JX7_E_F 1JXH_A_B 1JYO_E_D 1JZD_AB_C 1JZD_C_B 1JZT_A_B 1K0Z_A_B 1K2E_A_B 1K3R_A_B 1K3S_A_B 1K4C_AB_C 1K4R_C_B 1K4U_P_S 1K50_B_D 1K5D_AB_C 1K5G_G_H 1K66_A_B 1K6D_A_B 1K74_AB_DE 1K7L_C_G 1K93_A_D 1KAM_A_D 1KAR_A_B 1KBQ_A_C 1KCF_A_B 1KF9_A_C 1KHU_C_B 1KHV_A_B 1KHW_A_B 1KI9_C_B 1KIG_I_H 1KIZ_A_B 1KJN_A_B 1KKE_A_B 1KKL_ABC_H 1KLU_AB_D 1KM1_A_B 1KNX_E_F 1KNY_A_B 1KNZ_I_J 1KPC_A_B 1KRL_C_D 1KSH_A_B 1KTK_B_F 1KTZ_A_B 1KVE_C_D 1KXQ_H_A 1KXT_A_B 1KXV_A_C 1KY6_A_P 1KYQ_A_B 1KZC_1_2 1L0X_A_B 1L0Y_A_B 1L3L_A_C 1L5X_A_B 1L6X_A_B 1L8C_A_B 1L8D_A_B 1L8L_A_B 1LBH_A_B 1LDC_A_B 1LDP_H_P 1LE5_A_E 1LEH_A_B 1LFD_B_A 1LFD_C_D 1LGR_F_H 1LHR_A_B 1LI1_E_D 1LJ2_A_B 1LK3_IM_B 1LK5_A_B 1LKY_C_D 1LLI_A_B 1LM7_A_B 1LMK_E_G 1LNY_A_B 1LP1_A_B 1LQS_M_L 1LQW_A_B 1LSS_A_B 1LT7_A_B 1LUA_C_B 1LUC_A_B 1LWI_A_B 1LX5_A_B 1LX7_A_B 1LYW_G_H 1LZW_A_B 1M10_A_B 1M1E_A_B 1M1J_C_B 1M1T_A_B 1M27_AB_C 1M2B_A_B 1M32_C_D 1M34_B_E 1M5N_S_Q 1M7E_C_F 1M7G_C_D 1M7H_A_B 1M7U_A_B 1M8A_A_B 1M93_A_B 1M9F_C_B 1MA9_A_B 1MAH_A_F 1MB2_C_F 1MC3_A_B 1MCO_H_L 1MD0_A_B 1MDY_A_B 1MEC_3_2 1MF4_A_B 1MHC_D_F 1MHP_XY_B 1MHW_A_C 1MJT_A_B 1MKM_A_B 1ML1_A_E 1ML1_I_K 1MLC_AB_E 1MNM_A_B 1MO1_A_B 1MOE_A_B 1MPS_H_M 1MQ8_A_B 1MQS_A_B 1MR9_C_B 1MSB_A_B 1MTO_C_D 1MV8_C_D 1MVK_A_C 1MW5_A_B 1MWQ_A_B 1MXE_A_E 1MY7_A_B 1N0E_A_H 1N13_E_F 1N1C_A_B 1N1E_A_B 1N23_A_B 1N2C_ABCD_EF 1N2D_A_C 1N2M_E_F 1N4M_B_D 1N6J_A_B 1N7F_A_B 1N80_C_D 1N9E_C_D 1N9J_A_B 1N9S_G_F 1NA1_A_B 1NA6_A_B 1NBA_C_D 1NBW_A_C 1NBY_BA_C 1NCA_HL_N 1NCB_HL_N 1ND6_A_B 1NDG_BA_C 1NDM_BA_C 1NF3_A_C 1NFD_FE_B 1NFV_G_H 1NGM_E_F 1NGM_M_N 1NH2_B_D 1NH2_C_D 1NHW_B_D 1NJ8_A_B 1NJJ_A_B 1NKI_A_B 1NKQ_E_F 1NKV_A_B 1NLN_A_B 1NMB_HL_N 1NN4_C_D 1NNQ_A_B 1NOV_A_D 1NP3_C_D 1NP8_A_B 1NPO_A_B 1NPP_A_B 1NPP_C_D 1NR4_C_D 1NSN_HL_S 1NT2_A_B 1NVI_E_D 1NVM_A_C 1NVU_Q_S 1NVU_S_R 1NW2_E_H 1NW9_A_B 1NW9_B_A 1NWD_A_C 1NWW_A_B 1NX1_A_B 1NX1_A_C 1NZ0_A_C 1O0W_A_B 1O1N_A_B 1O28_A_D 1O4U_A_B 1O57_C_D 1O61_A_B 1O63_A_B 1O7L_C_D 1O94_A_B 1O94_C_D 1O9I_A_F 1O9K_A_B 1O9K_A_P 1OA8_A_B 1OAN_A_B 1OB1_BA_C 1OB8_A_B 1OC0_A_B 1OCW_H_L 1OCZ_Q_R 1OEY_A_J 1OEY_C_L 1OFU_B_Y 1OFU_XY_A 1OG6_C_B 1OGY_A_B 1OHF_A_C 1OHF_B_D 1OHF_C_D 1OHV_A_B 1OIA_A_B 1OJ7_A_D 1OJH_C_D 1OLP_C_D 1OMZ_A_B 1ONW_A_B 1OOQ_A_B 1OP9_A_B 1OPH_A_B 1OQ1_B_D 1OQB_C_D 1OQC_B_D 1OQJ_A_B 1OR6_A_B 1OR7_A_C 1ORQ_BA_C 1ORQ_C_B 1ORS_BA_C 1ORY_A_B 1OSG_F_L 1OSP_HL_O 1OT8_C_B 1OTU_A_B 1OTW_A_B 1OV3_A_B 1OW4_A_B 1OXH_A_B 1OXK_C_F 1OXK_G_H 1OY1_A_B 1OY5_A_C 1OYP_A_B 1OZ7_A_B 1P27_A_B 1P2C_AB_C 1P32_A_B 1P4O_A_B 1P4Q_A_B 1P51_A_B 1P6X_A_B 1P7G_K_J 1P8C_A_E 1P9E_A_B 1P9L_A_B 1P9O_A_B 1PB0_A_B 1PC6_A_B 1PCF_E_F 1PCZ_A_B 1PF9_C_D 1PF9_H_N 1PFF_A_B 1PIV_3_2 1PJM_A_B 1PJN_A_B 1PJS_A_B 1PK1_A_B 1PK8_A_B 1PK8_A_C 1PKQ_GF_J 1PKQ_G_J 1PM3_A_B 1PNB_A_B 1POI_A_B 1POI_A_C 1PQZ_A_B 1PUF_A_B 1PUG_C_D 1PUI_A_B 1PWE_E_F 1PXT_A_B 1PYA_E_F 1PYI_A_B 1PYT_A_B 1PYT_A_C 1PYT_B_D 1PYW_A_D 1PZM_A_B 1PZN_E_D 1PZR_A_B 1Q05_A_B 1Q08_A_B 1Q0K_H_K 1Q0K_I_H 1Q10_A_B 1Q1T_A_C 1Q23_I_H 1Q2H_A_B 1Q3U_A_B 1Q40_C_D 1Q4Q_D_Q 1Q52_A_D 1Q57_A_B 1Q5X_A_B 1Q6I_A_B 1Q74_A_B 1Q7L_C_D 1QA9_A_B 1QAV_A_B 1QBZ_A_B 1QCB_H_D 1QD6_B_D 1QE6_C_D 1QEX_A_B 1QFH_A_B 1QFU_HL_A 1QFW_IM_AB 1QFX_A_B 1QG7_A_B 1QGE_E_D 1QGT_A_B 1QHH_A_B 1QI9_A_B 1QIP_C_D 1QJG_E_F 1QKI_E_F 1QL0_A_B 1QM5_A_B 1QOL_A_F 1QQ5_A_B 1QQJ_A_B 1QS4_C_B 1QSO_A_B 1QVR_A_B 1QVR_C_B 1QX5_B_K 1QXN_A_B 1QXO_A_B 1QXO_B_D 1QYN_A_B 1QZ7_A_B 1R15_E_F 1R1U_A_B 1R2F_A_B 1R30_A_B 1R3K_C_B 1R3N_C_D 1R4A_F_H 1R4C_A_B 1R4M_B_D 1R4M_G_H 1R52_C_D 1R5I_A_D 1R5X_A_B 1R6O_A_C 1R6Q_A_C 1R7H_A_B 1R7I_A_B 1R8J_A_B 1R8O_A_B 1R8S_A_E 1R8U_A_B 1RB8_J_F 1RDF_C_B 1RER_A_C 1RF8_A_B 1RFZ_A_D 1RHG_A_C 1RHZ_A_B 1RI8_A_B 1RJC_A_B 1RJL_BA_C 1RK4_A_B 1RKC_A_B 1RKE_A_B 1RLB_ABCD_E 1RLD_A_B 1RLI_C_B 1RM0_A_B 1RM1_C_B 1RO7_C_D 1RP7_A_B 1RPN_A_D 1RPQ_A_W 1RPQ_C_Y 1RQD_A_B 1RTY_C_B 1RV6_VW_X 1RXD_C_B 1RXV_A_B 1RY1_C_D 1RYI_C_D 1RYY_E_G 1S16_A_B 1S26_C_F 1S28_C_D 1S3N_A_B 1S3Z_A_B 1S4F_A_B 1S4K_A_B 1S59_C_E 1S5F_E_D 1S7M_A_B 1S8F_A_B 1SB0_A_B 1SB2_A_B 1SBB_A_B 1SC6_A_B 1SDD_A_B 1SFK_A_B 1SFX_A_B 1SG2_A_C 1SG2_C_B 1SG4_A_B 1SGJ_A_B 1SHQ_A_B 1SHZ_A_C 1SIE_B_F 1SKV_A_B 1SLQ_E_F 1SND_A_B 1SOJ_A_J 1SP8_C_D 1SPB_P_S 1SPI_A_B 1SPP_A_B 1SQ0_A_B 1SQ7_A_B 1SQB_C_D 1SQE_A_B 1SQX_B_I 1SR4_A_C 1SR6_A_B 1SS4_A_B 1ST0_A_B 1STM_E_D 1STZ_A_B 1STZ_A_C 1SU1_A_D 1SUS_A_C 1SUV_A_B 1SV0_A_C 1SVZ_B_D 1SWJ_A_B 1SXJ_C_B 1SXJ_E_D 1SY6_HL_A 1SYQ_A_B 1SYR_E_L 1SYX_A_B 1SZ2_A_B 1SZH_A_B 1SZQ_A_B 1T01_A_B 1T08_A_C 1T0B_A_C 1T0F_B_D 1T0R_A_C 1T11_A_B 1T1L_A_B 1T1V_A_B 1T33_A_B 1T3I_A_B 1T3L_A_B 1T3U_A_B 1T3W_A_B 1T44_A_G 1T44_G_A 1T5Z_A_B 1T62_A_B 1T63_A_B 1T6G_B_D 1T6P_G_H 1T6S_A_B 1T70_C_D 1T8Q_C_B 1T98_A_B 1T9D_C_D 1T9G_C_B 1T9I_A_B 1TA3_A_B 1TB3_C_B 1TBA_A_B 1TBX_A_B 1TDQ_A_B 1TDT_A_B 1TE2_A_B 1TF0_A_B 1TH1_A_C 1TH7_E_H 1THN_A_C 1TIJ_A_B 1TJ7_A_B 1TJO_A_C 1TKV_A_B 1TLH_A_B 1TLJ_A_B 1TMC_A_B 1TMQ_A_B 1TMX_A_B 1TO0_G_H 1TO6_A_B 1TOA_A_B 1TQ8_C_D 1TQB_BC_A 1TT5_B_D 1TU1_A_B 1TUE_M_Q 1TVK_A_B 1TX4_A_B 1TXN_A_B 1TY4_A_C 1TY9_A_B 1TZ9_A_B 1TZH_HL_V 1U07_A_B 1U0R_C_B 1U0S_Y_A 1U2E_A_C 1U2M_A_B 1U2V_C_G 1U4F_C_D 1U5I_A_B 1U5U_A_B 1U5W_E_F 1U69_B_D 1U6G_A_B 1U6J_G_H 1U6S_A_B 1U7H_A_B 1U7I_A_B 1U7Z_A_B 1U8S_A_B 1U8T_B_F 1U8V_B_D 1U8V_C_D 1UAC_HL_Y 1UAD_A_C 1UCY_I_N 1UD0_A_B 1UF2_D_P 1UFI_A_B 1UFO_C_D 1UI5_A_B 1UIJ_A_C 1UJ3_BA_C 1UL1_A_X 1ULG_B_D 1UM0_A_B 1UN8_A_B 1UNN_C_B 1UOD_A_B 1UP4_A_B 1UP8_C_D 1UR6_A_B 1US7_A_B 1USU_A_B 1USV_A_B 1USY_A_B 1UT4_A_B 1UTR_A_B 1UUN_A_B 1UUZ_A_D 1UVZ_E_F 1UWI_B_D 1V0E_D_F 1V18_A_B 1V1H_E_F 1V1P_A_B 1V26_A_B 1V3E_A_B 1V54_Q_X 1V5W_A_B 1V5X_A_B 1V7C_A_B 1V8D_A_B 1V8P_G_H 1VB5_A_B 1VC8_A_B 1VCB_E_F 1VCH_A_B 1VCH_C_D 1VDD_A_B 1VE5_C_B 1VEA_A_B 1VET_A_B 1VEU_A_B 1VFB_AB_C 1VG0_A_B 1VGL_C_D 1VH0_A_B 1VH5_A_B 1VH6_A_B 1VHK_C_D 1VHZ_A_B 1VJL_A_B 1VJQ_A_B 1VKM_A_B 1VL6_C_D 1VL7_A_B 1VLR_A_B 1VMD_A_B 1VMK_A_C 1VP2_A_B 1VPP_Y_W 1VR7_A_B 1VR9_A_B 1VRB_A_B 1VRK_A_B 1VRR_A_B 1VSG_A_B 1VSQ_A_B 1VYH_M_N 1VYT_A_E 1W1W_B_F 1W23_A_B 1W39_A_C 1W3B_A_B 1W3Z_A_B 1W4C_K_J 1W6U_C_D 1W9A_A_B 1W9Z_C_B 1WB4_A_B 1WD6_A_B 1WDJ_A_B 1WDL_A_B 1WDM_B_D 1WDW_BD_A 1WDW_F_H 1WDZ_A_B 1WEJ_HL_F 1WEK_C_D 1WKH_A_B 1WKQ_A_B 1WKV_A_B 1WLE_A_B 1WLI_A_B 1WMI_A_B 1WMS_A_B 1WN1_A_B 1WO8_C_B 1WOV_A_B 1WP7_A_B 1WPP_A_B 1WPX_A_B 1WQ1_R_G 1WQA_A_D 1WR6_A_E 1WRD_A_B 1WRS_S_R 1WSC_A_B 1WT5_B_D 1WTE_B_A 1WTU_A_B 1WWP_A_B 1WWR_A_B 1WX0_C_D 1WX1_A_B 1WYU_A_B 1WYW_A_B 1WYZ_B_D 1WZ7_C_B 1X0G_B_D 1X2H_A_C 1X2I_A_B 1X6V_A_B 1X7O_A_B 1X87_A_B 1X8D_A_B 1X8S_A_B 1X8Z_A_B 1X9A_A_B 1X9J_G_H 1XAO_A_B 1XCB_C_D 1XCR_A_B 1XD9_A_B 1XDK_E_F 1XDP_A_B 1XEB_A_D 1XF6_B_D 1XF9_A_D 1XFC_A_B 1XG5_C_D 1XHN_A_B 1XHU_A_B 1XI8_A_B 1XIW_E_F 1XJ7_A_B 1XKP_A_C 1XKP_C_B 1XL3_B_D 1XLY_A_B 1XM3_A_B 1XNY_A_B 1XOU_A_B 1XQH_A_B 1XQS_A_C 1XQS_B_D 1XR0_A_B 1XR4_A_B 1XTG_A_B 1XTT_C_D 1XU1_ABD_T 1XU1_B_S 1XUV_A_C 1XWO_A_C 1XX7_B_F 1XXI_C_B 1XXI_E_D 1XY7_A_B 1XZ8_A_B 1XZP_A_B 1Y0B_C_D 1Y0H_A_B 1Y0U_A_B 1Y10_A_B 1Y1A_A_B 1Y23_C_D 1Y2I_A_E 1Y2M_A_D 1Y33_I_E 1Y3A_B_F 1Y4M_A_B 1Y4Z_C_B 1Y56_A_B 1Y5Y_C_B 1Y60_E_D 1Y64_A_B 1Y6K_L_R 1Y6M_L_R 1Y6N_L_R 1Y7Q_A_B 1Y7R_A_B 1Y82_A_B 1Y8G_A_B 1Y8N_A_B 1Y8Q_A_B 1Y8T_A_C 1YA0_A_B 1YAF_A_C 1YAU_Q_P 1YAV_A_B 1YC8_A_B 1YD8_U_H 1YDG_E_F 1YDI_A_B 1YE9_B_F 1YE9_C_B 1YE9_K_N 1YEW_I_J 1YF2_A_B 1YF9_A_B 1YJ7_C_D 1YJD_HL_C 1YKE_C_D 1YKJ_A_B 1YLM_A_B 1YLX_A_B 1YNH_A_D 1YNJ_K_J 1YNT_DC_G 1YNT_D_G 1YP2_A_B 1YQF_E_F 1YQV_HL_Y 1YRB_A_B 1YRN_A_B 1YRT_A_B 1YRU_A_B 1YTV_A_M 1YUM_B_D 1YV1_A_B 1YVI_A_B 1YWH_E_F 1YWK_A_C 1YYV_A_B 1Z01_A_C 1Z0K_A_B 1Z1G_C_D 1Z2X_A_B 1Z3G_IM_B 1Z69_C_D 1Z6O_A_M 1Z6O_B_K 1Z6Y_A_B 1Z7M_A_B 1Z7Q_C_B 1Z7U_A_B 1Z82_A_B 1Z85_A_B 1Z8K_A_C 1Z92_A_B 1Z94_C_B 1Z9O_B_H 1ZA3_HL_R 1ZAE_A_B 1ZAV_U_V 1ZBB_G_H 1ZBX_A_B 1ZC3_A_D 1ZC4_A_D 1ZC4_B_D 1ZCT_A_B 1ZDN_A_B 1ZFN_A_B 1ZGX_A_B 1ZHH_A_B 1ZHI_A_B 1ZKE_B_F 1ZKP_B_D 1ZKU_C_B 1ZM4_A_B 1ZMY_A_L 1ZN7_A_B 1ZNP_C_B 1ZOQ_B_D 1ZOT_A_B 1ZPQ_A_B 1ZPQ_C_D 1ZPS_A_B 1ZT9_E_D 1ZTX_HL_E 1ZV5_L_A 1ZVH_A_L 1ZVH_L_A 1ZVY_A_B 1ZX4_A_B 1ZXM_A_B 1ZXO_C_E 1ZXZ_A_B 1ZY4_A_B 1ZY7_A_B 2A07_I_H 2A19_A_B 2A1A_B_A 2A1F_C_D 2A1S_A_D 2A1T_D_S 2A2J_A_B 2A2O_C_D 2A2O_E_D 2A40_E_D 2A41_A_C 2A4R_A_B 2A4W_A_B 2A56_C_D 2A5D_A_B 2A5H_C_D 2A5T_A_B 2A61_C_D 2A67_A_D 2A6A_A_B 2A6D_L_H 2A6K_A_B 2A6Q_C_F 2A6S_A_B 2A72_A_B 2A73_A_B 2A74_E_D 2A78_A_B 2A7K_I_H 2A7U_A_B 2A7W_I_J 2A9K_A_B 2A9S_A_B 2ABM_G_H 2ACM_A_B 2ADF_HL_A 2ADL_A_B 2ADV_C_B 2AE8_E_D 2AEP_HL_A 2AF4_C_D 2AHM_B_F 2AJF_A_E 2ANU_A_B 2AO9_A_H 2AP6_A_B 2AP9_C_B 2APT_A_B 2AQ1_A_B 2AQ2_A_B 2AQ3_A_B 2ARJ_HL_Q 2ARK_C_D 2ARP_A_F 2ARR_A_P 2ASS_A_B 2AST_A_B 2ATX_A_B 2AUH_A_B 2AUN_A_B 2AVU_C_D 2AVU_D_F 2AVU_E_F 2AW2_A_B 2AW6_A_F 2AXT_A_D 2AXT_A_I 2AYO_A_B 2AZE_A_B 2B0Z_A_B 2B10_A_B 2B11_A_B 2B12_A_B 2B2K_A_B 2B2X_HL_A 2B3D_A_B 2B3S_A_B 2B43_B_D 2B4C_H_G 2B4J_AB_C 2B5F_A_B 2B5L_A_C 2B5U_C_D 2B7C_A_B 2B81_A_B 2B8W_A_B 2B99_B_D 2B9B_C_B 2B9S_A_B 2B9Z_A_B 2BA0_B_E 2BA0_E_H 2BAY_A_D 2BAY_E_F 2BCJ_A_Q 2BCX_A_B 2BDN_HL_A 2BE6_A_D 2BEC_A_B 2BEX_B_D 2BFG_F_H 2BGC_G_F 2BGW_A_B 2BIS_A_B 2BKI_A_B 2BM8_I_H 2BMC_A_C 2BMC_E_F 2BOL_A_B 2BP7_A_B 2BQZ_A_B 2BSE_A_C 2BSJ_A_B 2BTU_A_B 2BW3_A_B 2BWN_E_D 2BYC_A_B 2BYK_A_B 2BYM_A_B 2BYM_C_D 2BZN_G_H 2C0L_A_B 2C1L_A_B 2C1M_A_B 2C1T_A_C 2C21_C_D 2C23_A_P 2C2I_A_B 2C2L_C_D 2C2L_C_G 2C2X_A_B 2C37_S_T 2C3B_A_B 2C41_E_H 2C57_A_C 2C5J_A_B 2C6X_C_D 2C7M_A_B 2C7N_A_B 2C9J_E_G 2C9N_Y_Z 2C9T_F_J 2CAY_A_B 2CB2_C_B 2CDB_A_C 2CDB_C_D 2CDU_A_B 2CFH_A_C 2CH5_A_B 2CHP_A_D 2CJ9_A_B 2CJS_A_C 2CKF_B_F 2CLB_A_B 2CLY_E_D 2CMR_HL_A 2CN4_A_B 2CO5_A_B 2CPK_E_I 2CS7_A_C 2CT9_A_B 2CVO_A_B 2CVO_A_D 2CVO_B_D 2CW6_C_D 2CWO_C_B 2CXS_A_B 2CZV_B_D 2D00_A_F 2D13_B_D 2D1C_A_B 2D1W_A_B 2D42_A_B 2D4C_A_B 2D4U_A_B 2D4V_A_B 2D68_A_B 2D8D_A_B 2DB4_A_B 2DB7_A_B 2DC0_A_B 2DCN_G_I 2DD4_A_C 2DD5_B_J 2DD8_H_L 2DDK_A_B 2DDM_A_B 2DDZ_A_B 2DE5_B_E 2DEX_A_X 2DF7_H_O 2DI3_A_B 2DJF_A_B 2DKJ_A_B 2DLB_A_B 2DM9_A_B 2DPD_A_B 2DPN_A_B 2DPP_A_B 2DS2_A_B 2DS6_A_B 2DT5_A_B 2DU4_A_B 2DUM_C_B 2DV6_D_F 2DVM_C_D 2DVT_A_B 2DWN_C_D 2DX0_A_B 2DX5_A_B 2DX7_A_B 2DXB_B_K 2DXB_I_H 2E0N_A_B 2E1M_A_B 2E1M_A_C 2E1M_C_B 2E2D_A_C 2E2K_C_D 2E2P_A_B 2E5F_A_B 2E6F_A_B 2E6G_A_B 2E7J_A_B 2E7S_G_H 2E85_A_B 2E89_A_B 2E9D_A_B 2E9F_A_D 2E9X_E_G 2EAY_A_B 2EB0_A_B 2EBY_A_B 2EC9_U_T 2ED4_A_B 2ED6_G_H 2EF7_A_B 2EF8_A_B 2EFC_C_D 2EFD_A_B 2EFH_A_B 2EG5_E_G 2EGG_A_B 2EGO_A_B 2EH8_L_P 2EIZ_BA_C 2EJ0_B_D 2EJN_A_B 2EJW_A_B 2EK5_A_B 2EKD_C_B 2EKY_B_D 2EPO_A_B 2EQ5_A_B 2ERJ_A_D 2ERJ_G_H 2ES4_A_D 2ES4_B_E 2ESM_A_B 2EV4_A_B 2EV5_A_B 2EX5_B_A 2F03_A_C 2F07_A_B 2F08_C_B 2F1V_C_B 2F22_A_B 2F2A_C_B 2F2E_A_B 2F2O_A_B 2F2T_A_B 2F31_A_B 2F3E_A_B 2F3T_E_F 2F48_A_B 2F4E_A_B 2F4L_C_D 2F4M_A_B 2F4N_A_C 2F4P_A_B 2F54_A_C 2F5G_A_B 2F5I_A_B 2F5J_A_B 2F6L_A_B 2F6U_A_B 2F7S_A_B 2F8B_A_B 2F8J_C_D 2F9I_C_D 2F9W_A_B 2F9Z_A_C 2FBK_A_B 2FCH_A_E 2FCO_A_B 2FD6_HL_U 2FDO_A_B 2FE8_A_B 2FEL_G_F 2FEN_I_L 2FEW_A_B 2FF6_A_H 2FFF_A_B 2FG6_C_E 2FG8_C_D 2FGE_A_D 2FGY_A_B 2FHJ_A_B 2FHO_A_B 2FHX_A_B 2FJC_E_H 2FJH_BA_W 2FKB_A_C 2FKC_A_B 2FKW_O_P 2FLF_E_F 2FLH_C_D 2FMI_A_B 2FMY_C_D 2FN0_A_B 2FNE_C_B 2FNP_A_B 2FPW_A_B 2FQM_E_F 2FQZ_C_D 2FS5_A_B 2FSW_A_B 2FSY_E_D 2FTX_A_B 2FU5_C_B 2FUR_A_B 2FUV_A_B 2FV2_C_D 2FVM_A_B 2FW7_A_B 2FXA_A_B 2FYI_A_B 2FYN_A_D 2FYW_A_B 2FZV_B_D 2G38_C_D 2G3K_E_D 2G3O_C_E 2G42_A_B 2G45_E_D 2G47_A_C 2G5C_B_D 2G6Y_C_D 2G76_A_B 2G77_A_B 2G84_A_B 2G9I_A_B 2G9W_A_B 2GA0_C_D 2GA0_C_G 2GAF_D_A 2GAN_A_B 2GDG_C_B 2GED_A_B 2GH8_A_C 2GIA_B_G 2GJ3_A_B 2GKS_A_B 2GL0_C_B 2GL7_A_B 2GLJ_E_I 2GLJ_G_J 2GLZ_A_B 2GM3_C_D 2GM3_C_E 2GMY_C_B 2GN8_A_B 2GNG_A_I 2GO7_A_B 2GOX_A_B 2GPV_A_E 2GR7_D_F 2GR8_C_D 2GS9_A_B 2GSK_A_B 2GSV_A_B 2GSZ_A_F 2GTP_A_D 2GTY_A_B 2GUH_A_B 2GUM_A_C 2GUZ_I_J 2GV5_A_C 2GVQ_C_B 2GVY_A_B 2GWW_A_B 2GXF_A_B 2GYQ_A_B 2GZ4_A_C 2GZA_A_B 2H0D_A_B 2H0Q_A_B 2H19_A_B 2H27_A_D 2H3H_A_B 2H4M_A_C 2H4O_C_B 2H5L_E_F 2H5N_A_B 2H62_A_D 2H6B_A_B 2H6C_A_B 2H6L_A_C 2H7V_A_C 2H8P_C_D 2H9B_A_B 2H9E_H_C 2H9G_BA_R 2H9G_H_S 2HA9_A_B 2HAY_C_D 2HBV_A_B 2HCI_A_B 2HCR_A_B 2HD0_I_J 2HD5_A_B 2HDN_K_L 2HDW_A_B 2HE2_A_B 2HE9_A_B 2HEG_A_B 2HET_A_D 2HEV_F_R 2HF0_A_B 2HFJ_A_B 2HG4_E_F 2HIN_A_B 2HJ0_A_B 2HJ9_A_C 2HLZ_B_D 2HMI_CD_AB 2HNE_C_D 2HOX_A_B 2HP0_A_B 2HQS_A_H 2HQW_A_B 2HRK_A_B 2HRT_E_D 2HRV_A_B 2HSN_A_B 2HSQ_A_B 2HTH_A_B 2HTY_B_D 2HU2_A_B 2HVG_A_B 2HVW_C_B 2HWW_A_B 2HXG_A_C 2HXI_A_B 2HXO_A_B 2HXX_A_B 2HYD_A_B 2HYX_C_D 2HZB_A_B 2HZG_A_B 2HZK_C_D 2I10_A_B 2I14_C_D 2I15_A_C 2I1A_C_D 2I25_N_L 2I26_N_L 2I2O_A_B 2I2R_D_H 2I2X_M_O 2I33_A_B 2I3O_C_D 2I3S_A_B 2I3S_C_D 2I3T_A_B 2I5B_A_B 2I6T_A_B 2I7N_A_B 2I8D_A_B 2I9B_E_A 2I9F_C_D 2I9L_HG_L 2I9U_A_B 2IA2_A_D 2IAB_A_B 2IAZ_B_D 2IBD_A_B 2IBG_B_E 2IDB_A_B 2IDE_C_D 2IDR_A_B 2IEP_A_B 2IEY_A_B 2IGA_A_C 2IH3_AB_C 2IHW_A_F 2IIJ_A_B 2IIR_I_J 2IJC_C_B 2IJZ_G_J 2IKB_A_C 2IMB_A_B 2IMH_A_B 2INP_A_C 2INU_C_B 2IO5_A_B 2IOB_A_B 2IOU_D_F 2IP2_A_B 2IPH_A_B 2IPP_A_B 2ISJ_C_D 2ISQ_A_B 2IU9_A_B 2IUO_I_J 2IV8_A_P 2IV9_A_P 2IVF_A_B 2IW5_A_B 2IX2_A_B 2IYB_A_E 2IZ5_C_B 2IZO_A_C 2IZZ_A_B 2J0F_A_C 2J0Q_B_I 2J0T_A_D 2J0X_A_B 2J28_Q_R 2J41_C_D 2J4E_G_F 2J4L_E_F 2J59_A_M 2J5T_G_H 2J6E_HL_A 2J6R_A_B 2J6X_G_H 2J6Y_A_B 2J7P_A_D 2J88_HL_A 2J90_A_B 2J98_A_B 2J9F_A_C 2JAM_A_B 2JAQ_A_B 2JBY_A_B 2JC2_A_C 2JCD_A_B 2JDI_G_H 2JDL_B_D 2JEL_HL_P 2JGN_A_C 2JGZ_A_B 2JI6_A_B 2JI9_A_B 2JIX_HL_E 2JJ7_A_B 2JK3_A_B 2JKI_A_S 2JKT_I_L 2JL4_A_B 2JLM_E_D 2JNR_A_B 2JRI_A_C 2JV7_A_B 2JW1_A_B 2JXC_A_B 2JZ0_A_B 2JZI_A_B 2K42_A_B 2K6Q_A_B 2K7I_A_B 2K7L_A_B 2KA4_A_B 2KA6_A_B 2KDU_A_B 2KEL_A_B 2KFH_A_B 2KHM_A_B 2KLH_A_B 2KNB_A_B 2KQF_A_B 2KSP_A_B 2KT5_A_B 2KTF_A_B 2KWF_A_B 2KWI_A_B 2KWJ_B_A 2KWK_B_A 2KWO_B_A 2KWU_A_B 2KWV_A_B 2KXH_A_B 2KXW_A_B 2L0I_A_B 2L0T_A_B 2L14_A_B 2L1C_A_B 2L1L_A_B 2L1W_A_B 2L2L_A_B 2L8T_A_B 2L9S_A_B 2LAG_A_B 2LD7_A_B 2LEH_A_B 2LFH_A_B 2LFS_A_B 2LFW_A_B 2LKM_A_B 2LOX_A_B 2LP0_A_B 2LP4_A_Y 2LPB_A_B 2LQC_A_B 2LQH_A_B 2LUH_A_B 2LVO_A_C 2LWW_A_B 2LXM_A_B 2LY4_A_B 2LZ6_A_B 2M04_A_B 2M0G_A_B 2M0J_A_B 2M55_A_B 2M5A_A_B 2M5B_A_B 2M86_A_B 2MBB_A_B 2MEJ_A_B 2MEV_1_2 2MFQ_A_B 2MJ5_A_B 2MLX_B_A 2MLZ_B_A 2MP0_A_B 2MPR_A_B 2MRE_A_B 2MRO_A_B 2MUR_A_B 2MV7_A_B 2MWS_A_B 2MZD_A_B 2N01_A_B 2N1D_A_B 2N2H_A_B 2N73_A_B 2NNN_A_B 2NNW_A_B 2NO4_A_B 2NOX_C_D 2NP5_B_D 2NP9_C_B 2NPI_B_D 2NQL_A_B 2NR5_C_B 2NR6_FE_B 2NUD_B_D 2NUU_E_F 2NUX_A_B 2NV1_C_D 2NV2_U_V 2NV4_A_B 2NVM_A_B 2NX4_A_D 2NXN_A_B 2NY1_DC_A 2NYI_A_B 2NYX_C_D 2NYY_DC_A 2NYZ_AB_D 2NZ1_A_B 2NZ7_A_B 2NZ8_A_B 2NZ9_DC_A 2O0Y_C_D 2O1S_C_D 2O1T_A_J 2O20_A_B 2O38_A_B 2O3A_A_B 2O3B_A_B 2O42_A_B 2O4M_A_B 2O5I_M_N 2O74_E_F 2O8G_J_B 2O8V_A_B 2O9A_C_B 2OB9_A_B 2OBH_B_D 2OBN_C_D 2OCF_A_D 2OCT_A_B 2OCV_A_B 2OD6_A_B 2ODM_A_B 2OEL_A_B 2OFV_A_B 2OFX_A_B 2OFY_A_B 2OGF_B_D 2OGX_A_B 2OH1_C_D 2OIE_C_D 2OIZ_B_D 2OK2_A_B 2OKF_A_B 2OKI_A_B 2OKJ_A_B 2OKU_A_B 2OL5_A_B 2OM2_C_D 2OMT_A_B 2OMU_A_B 2OMV_A_B 2OMW_A_B 2OMX_A_B 2OMY_A_B 2OMZ_A_B 2OND_A_B 2ONL_A_C 2ONL_B_D 2OOB_A_B 2OOJ_A_B 2OOR_AB_C 2OPD_A_B 2OQ2_A_B 2OQM_A_B 2OR0_A_B 2OS7_A_B 2OS9_C_B 2OST_B_D 2OSZ_A_B 2OSZ_A_C 2OT3_B_A 2OT8_A_C 2OTK_C_E 2OTP_A_B 2OTX_A_B 2OU5_A_B 2OUK_A_B 2OUW_A_B 2OV2_F_N 2OV9_C_D 2OX7_A_D 2OYY_A_B 2OZ4_HL_A 2OZA_A_B 2OZA_B_A 2OZN_A_B 2P06_A_B 2P0J_A_B 2P0S_A_B 2P10_B_D 2P1J_A_B 2P1L_A_B 2P1N_B_E 2P1Q_A_B 2P22_A_C 2P2C_K_L 2P3Y_A_B 2P4W_A_B 2P5Q_A_C 2P5R_A_B 2P62_A_B 2P64_A_B 2P6I_A_B 2P8I_A_B 2P8P_C_B 2P8Q_A_B 2P9E_A_D 2P9J_C_B 2P9L_D_F 2P9P_G_F 2PB2_A_B 2PBI_A_B 2PC6_A_C 2PCB_A_B 2PCC_A_B 2PD1_B_D 2PDO_C_D 2PDR_C_B 2PEB_A_B 2PEN_C_D 2PF4_E_F 2PG1_G_F 2PG4_A_B 2PGC_B_D 2PGN_A_B 2PHD_A_C 2PHG_A_B 2PHN_A_B 2PIF_A_B 2PIH_A_B 2PJS_A_B 2PJU_C_D 2PJW_H_V 2PLA_A_B 2PLG_A_B 2PLR_A_B 2PM7_A_C 2PMS_A_C 2POB_A_B 2POK_A_B 2PP0_C_B 2PP1_A_B 2PPY_B_F 2PQA_A_B 2PQN_A_B 2PQQ_A_D 2PQR_B_D 2PQU_C_D 2PR6_A_B 2PRO_A_B 2PRU_A_B 2PSM_A_F 2PTF_A_B 2PTQ_A_B 2PTT_A_B 2PUK_E_G 2PUL_A_B 2PV2_C_F 2PV7_A_B 2PVP_A_B 2PVZ_A_B 2PZB_A_B 2PZH_A_D 2PZK_A_B 2Q03_A_B 2Q05_A_B 2Q08_E_F 2Q0J_A_B 2Q0O_A_B 2Q0O_A_C 2Q0T_A_B 2Q0X_A_B 2Q1E_A_B 2Q3F_A_B 2Q5D_A_C 2Q5E_C_E 2Q62_C_B 2Q6F_A_B 2Q6T_A_D 2Q6T_C_B 2Q73_A_B 2Q7F_A_B 2Q87_C_B 2Q8B_A_H 2Q8B_HL_A 2Q97_A_T 2Q9U_A_B 2QA7_C_D 2QAD_A_E 2QAZ_C_D 2QD0_A_B 2QDH_A_D 2QE9_A_B 2QFA_A_B 2QFC_A_B 2QFX_A_B 2QGI_A_B 2QGQ_G_F 2QGX_C_D 2QH1_A_B 2QH9_A_B 2QHO_A_B 2QIE_A_E 2QIW_A_B 2QIY_B_D 2QJA_B_D 2QJF_A_B 2QJG_I_H 2QJV_A_B 2QJW_A_B 2QKI_A_C 2QKM_E_F 2QKO_A_B 2QKP_A_B 2QL2_A_B 2QL3_I_J 2QLZ_A_B 2QM7_A_B 2QMA_A_B 2QMI_A_E 2QNA_A_B 2QNE_A_B 2QNF_A_B 2QNU_A_B 2QQ1_A_C 2QQD_G_H 2QQK_HL_A 2QQN_HL_A 2QQP_C_G 2QQP_E_G 2QQZ_A_B 2QR0_XW_V 2QR4_A_B 2QRD_B_G 2QRE_A_B 2QS8_A_B 2QSQ_A_B 2QST_A_B 2QT3_A_B 2QTQ_A_B 2QTS_E_D 2QUR_A_B 2QUY_E_G 2QV0_A_B 2QV6_A_C 2QXV_A_B 2QYG_C_D 2QYO_A_B 2QYP_A_B 2R00_A_B 2R05_A_B 2R0I_A_B 2R0K_HL_A 2R0L_HL_A 2R0Q_C_D 2R19_A_B 2R1F_A_B 2R25_A_B 2R29_HL_A 2R47_A_B 2R4I_A_B 2R56_HL_A 2R5J_F_J 2R5U_E_D 2R6A_A_B 2R6A_A_C 2R6F_A_B 2R6O_A_B 2R6U_B_D 2R78_C_D 2R7G_A_E 2R87_A_C 2R8E_A_C 2R8Q_A_B 2R97_A_C 2R9E_A_B 2RA6_C_D 2RAF_A_B 2RAS_A_B 2RAX_E_F 2RB9_C_D 2RBB_A_B 2RBD_A_B 2RCC_A_B 2RD7_A_C 2RD9_A_B 2RDC_A_B 2RDE_A_B 2RDM_C_B 2RF9_A_C 2RFD_B_D 2RG7_B_D 2RGN_A_B 2RH0_A_B 2RHK_A_C 2RHS_A_D 2RHS_C_D 2RJZ_A_B 2RK0_A_B 2RK9_A_B 2RKK_A_B 2RP4_C_D 2RSL_A_B 2RU4_A_B 2RUS_A_B 2RVB_A_B 2SPC_A_B 2UTG_A_B 2UUU_C_D 2UV1_A_B 2UVP_A_B 2UX8_A_C 2UX9_C_F 2UXH_A_B 2UYZ_A_B 2UZ3_A_C 2UZC_A_B 2UZI_HL_R 2V0O_A_B 2V0X_A_B 2V3W_A_B 2V4I_G_H 2V4Z_A_B 2V54_A_B 2V57_A_B 2V5H_D_I 2V5Q_A_D 2V6B_C_D 2V6X_A_B 2V7Q_D_J 2V7X_A_C 2V8S_E_V 2V8U_A_B 2V8W_E_F 2V92_B_E 2V9P_G_L 2V9T_A_B 2VAX_G_L 2VAY_A_B 2VBF_A_B 2VCG_A_D 2VDB_A_B 2VDW_E_F 2VE7_A_C 2VE7_B_D 2VEE_A_C 2VEF_A_B 2VF1_A_B 2VFX_C_J 2VGL_B_M 2VGL_S_B 2VH5_HL_R 2VHI_C_D 2VHW_A_C 2VIR_AB_C 2VIS_AB_C 2VKO_A_C 2VLG_A_D 2VLN_A_B 2VLO_A_B 2VLP_A_B 2VLQ_A_B 2VMB_A_B 2VMK_A_B 2VN8_A_B 2VOF_C_D 2VOG_A_B 2VOH_A_B 2VOI_A_B 2VPV_A_B 2VQA_A_B 2VRC_A_B 2VRN_A_B 2VRQ_A_C 2VSG_A_B 2VSM_A_B 2VT3_A_B 2VUB_A_B 2VUC_A_B 2VUN_C_D 2VUO_A_B 2VVX_A_B 2VWE_LJ_B 2VX8_A_B 2VXB_A_B 2VXO_A_B 2VXQ_A_H 2VXQ_HL_A 2VXT_HL_I 2VZD_A_C 2W01_A_B 2W27_A_B 2W2B_A_B 2W2U_B_D 2W2W_A_F 2W2X_A_D 2W3P_A_B 2W4L_E_D 2W4L_E_F 2W4S_C_D 2W54_E_F 2W5X_A_B 2W69_A_D 2W6H_G_I 2W6H_I_H 2W7R_A_B 2W84_A_B 2W85_A_B 2W8B_A_H 2W8M_A_B 2W8S_A_B 2W9E_HL_A 2W9S_A_D 2WB1_O_S 2WBT_A_B 2WCD_O_N 2WD5_A_B 2WEL_A_D 2WFF_1_2 2WFF_1_3 2WFF_3_2 2WFL_A_B 2WG5_A_B 2WGL_A_C 2WH6_A_B 2WIU_B_D 2WIV_A_B 2WJ0_A_B 2WJ8_E_D 2WJV_A_D 2WKN_F_H 2WKW_A_B 2WL8_A_C 2WL8_C_B 2WLB_A_B 2WMM_A_B 2WP3_T_O 2WP9_A_B 2WPT_A_B 2WPV_C_B 2WPX_A_B 2WSF_A_B 2WSU_B_D 2WTE_A_B 2WTH_A_B 2WUK_A_B 2WUS_A_R 2WVE_A_B 2WVH_B_E 2WVM_A_B 2WWB_A_B 2WWK_T_O 2WWW_C_D 2WX3_A_B 2WX4_E_D 2WY3_B_A 2WY8_A_Q 2WYE_A_B 2WYI_A_B 2WYM_C_D 2WYR_G_L 2WZJ_C_B 2WZP_B_D 2X04_B_D 2X0D_A_B 2X0G_A_B 2X0X_A_D 2X17_3_L 2X1X_E_R 2X2D_D_C 2X2E_A_D 2X3B_A_B 2X3F_A_B 2X3H_A_B 2X3L_A_B 2X3Y_E_G 2X4I_A_B 2X57_A_C 2X5D_B_D 2X5D_C_B 2X5H_A_D 2X65_A_B 2X6T_A_B 2X7J_A_D 2X7X_A_B 2X9A_D_C 2X9Q_A_B 2XA0_A_C 2XA7_B_M 2XAW_B_E 2XC1_C_B 2XCM_B_F 2XCT_B_D 2XCT_S_U 2XED_A_D 2XF7_B_F 2XFU_A_B 2XFV_A_B 2XGF_A_C 2XGY_A_B 2XHE_A_B 2XIU_A_B 2XJZ_B_J 2XKP_C_F 2XMA_E_F 2XN1_C_B 2XNS_B_D 2XPI_A_D 2XPP_A_B 2XPX_A_B 2XQB_HL_A 2XQN_A_T 2XQR_A_B 2XQY_GL_A 2XRA_HL_A 2XRN_A_B 2XRO_A_F 2XRX_W_X 2XSC_E_D 2XSN_C_B 2XSO_H_S 2XT2_A_B 2XTA_A_B 2XTJ_DB_A 2XTS_A_C 2XTT_A_B 2XUM_A_S 2XV6_A_B 2XVC_A_B 2XVT_D_F 2XWG_A_B 2XWJ_G_H 2XWQ_C_D 2XWT_AB_C 2XWT_A_C 2XWT_C_B 2XWX_A_B 2XYK_A_B 2XYR_A_B 2XZ9_A_B 2XZE_B_R 2XZE_R_B 2Y0B_D_H 2Y0F_A_B 2Y0I_A_S 2Y0M_A_B 2Y1H_A_B 2Y1L_C_E 2Y21_C_D 2Y32_A_D 2Y3D_A_B 2Y3M_A_B 2Y5B_A_B 2Y79_A_B 2Y7F_C_B 2Y7R_C_G 2Y8N_A_C 2Y8Q_A_B 2Y8S_A_B 2Y8T_A_B 2Y8T_E_D 2Y96_A_B 2Y9M_A_B 2YAL_A_B 2YB8_A_B 2YBF_A_B 2YC1_AB_C 2YF3_C_D 2YGD_C_D 2YGG_A_B 2YII_C_B 2YII_C_D 2YIL_C_D 2YIN_A_C 2YJE_C_M 2YJN_A_B 2YKR_C_J 2YKR_E_H 2YKR_F_R 2YKR_K_U 2YLE_A_B 2YM9_C_D 2YPV_HL_A 2YQ7_A_B 2YVE_A_B 2YVL_C_D 2YVX_A_B 2YWB_C_D 2YWM_A_B 2YXO_A_B 2YY7_A_B 2YYV_A_B 2YZE_C_B 2YZG_A_B 2YZR_C_B 2YZS_A_B 2Z0L_G_H 2Z0T_C_B 2Z2L_A_B 2Z2R_A_B 2Z2S_A_B 2Z2S_E_G 2Z3F_E_G 2Z3G_A_B 2Z3J_A_D 2Z3N_B_D 2Z3Q_A_B 2Z3R_A_B 2Z3R_G_K 2Z4E_B_I 2Z4R_C_B 2Z50_A_B 2Z58_A_B 2Z5C_E_D 2Z67_A_D 2Z69_A_B 2Z6E_C_D 2Z6J_A_B 2Z71_A_C 2Z7E_A_C 2Z8I_C_D 2Z8U_A_B 2Z8V_A_D 2Z8V_C_B 2Z8W_A_D 2Z9O_A_B 2Z9V_A_B 2ZAE_C_D 2ZB9_A_B 2ZBC_G_F 2ZBK_A_C 2ZC6_C_D 2ZCH_HL_P 2ZCI_B_D 2ZCL_P_H 2ZCN_A_B 2ZEJ_A_B 2ZET_A_C 2ZF3_A_B 2ZFD_A_B 2ZFW_E_D 2ZGI_A_D 2ZIH_A_B 2ZIU_A_B 2ZJD_C_D 2ZJS_HL_Y 2ZJS_Y_E 2ZME_A_B 2ZMF_A_B 2ZMV_A_B 2ZNJ_A_B 2ZNL_A_B 2ZNZ_A_B 2ZOF_A_B 2ZOQ_A_B 2ZQK_M_N 2ZRT_C_D 2ZSI_A_B 2ZSJ_A_B 2ZUC_A_B 2ZUQ_CB_A 2ZV3_A_B 2ZVY_A_B 2ZVZ_A_B 2ZW3_E_D 2ZXX_E_F 2ZY3_C_D 2ZY5_A_D 2ZYA_A_B 2ZYZ_A_B 2ZZX_A_D 3A17_E_F 3A1M_E_D 3A1Q_D_F 3A1Y_C_G 3A2N_E_F 3A2W_I_J 3A3D_A_B 3A3O_A_B 3A4I_A_B 3A4K_C_D 3A5I_A_B 3A6M_A_B 3A7O_C_D 3A8I_A_C 3A98_C_D 3A9K_A_C 3AAA_AB_C 3AAD_A_B 3AB0_BC_A 3AB1_A_B 3AB2_I_J 3AB2_I_K 3ABD_B_Y 3ABK_A_C 3ABK_P_W 3ABL_A_D 3ABM_A_B 3ABS_C_D 3AE8_C_B 3AEK_C_B 3AEO_C_D 3AEU_B_D 3AFK_A_B 3AFO_A_B 3AFQ_A_D 3AG3_C_G 3AGF_A_B 3AGY_A_B 3AI7_G_H 3AJ1_C_D 3AJB_A_B 3AJF_A_D 3AKO_E_F 3AL3_A_B 3ALP_A_B 3AMJ_A_B 3AMJ_C_D 3ANS_A_B 3ANY_A_C 3AO0_C_B 3AON_A_B 3AP2_A_B 3APY_A_B 3AQJ_P_R 3AQQ_C_B 3ASN_G_N 3ASO_B_I 3AU4_A_B 3AUY_A_B 3AXG_F_H 3AXJ_A_B 3AYH_A_B 3AYZ_B_D 3B0F_A_B 3B1B_A_B 3B2U_QR_P 3B2U_W_V 3B3D_A_C 3B42_A_B 3B48_A_B 3B4S_A_B 3B4S_C_E 3B4Y_A_B 3B5K_A_B 3B5U_E_F 3B5U_K_M 3B5U_M_N 3B63_E_F 3B63_I_J 3B63_K_L 3B63_M_L 3B6A_A_B 3B83_B_G 3B8I_E_F 3B9K_D_F 3B9K_HL_B 3B9O_A_B 3BA3_A_B 3BAL_C_B 3BAR_A_B 3BB8_A_B 3BB9_C_D 3BDB_A_B 3BDH_A_B 3BDY_HL_V 3BE6_A_B 3BEG_A_B 3BEY_D_F 3BEY_E_D 3BFJ_B_O 3BG0_E_F 3BG2_A_B 3BGE_A_B 3BGF_BC_A 3BGF_H_S 3BH3_A_B 3BH6_A_B 3BHQ_A_B 3BIC_A_B 3BJ6_A_B 3BJB_A_B 3BJD_A_B 3BJS_A_B 3BK3_A_C 3BKN_D_F 3BKY_H_L 3BL4_A_B 3BL5_C_B 3BLH_A_B 3BM2_A_B 3BM3_A_B 3BM5_A_B 3BN9_FE_A 3BNM_A_B 3BNV_E_F 3BNW_A_B 3BP8_AB_C 3BP8_B_D 3BPJ_B_D 3BPQ_A_B 3BPZ_B_D 3BQA_A_B 3BRJ_C_D 3BRQ_A_B 3BRT_A_B 3BRT_B_D 3BRV_A_B 3BRW_B_D 3BS5_A_B 3BSZ_NM_E 3BT3_A_B 3BTI_A_B 3BTP_A_B 3BU2_C_D 3BU3_A_B 3BU5_A_B 3BUA_A_B 3BUA_D_H 3BV6_E_D 3BWG_A_B 3BWL_C_D 3BWO_C_D 3BWV_A_B 3BXJ_A_B 3BYW_E_F 3BZD_A_B 3BZO_A_B 3C0K_A_B 3C18_A_B 3C1D_A_B 3C1L_E_F 3C1M_A_B 3C24_A_B 3C25_A_B 3C3J_E_F 3C3R_A_B 3C3W_A_B 3C48_A_B 3C4M_A_C 3C59_A_B 3C5O_B_D 3C5T_A_B 3C5W_P_C 3C5Y_I_J 3C66_A_C 3C66_B_D 3C6M_C_D 3C85_A_C 3C8J_A_B 3C9A_B_D 3C9G_A_B 3CAE_G_H 3CAZ_A_B 3CBM_A_B 3CBX_A_B 3CBY_A_B 3CC0_C_B 3CDK_A_C 3CDZ_A_B 3CEA_B_D 3CES_C_D 3CF0_K_L 3CF2_A_B 3CF3_C_B 3CF4_A_G 3CFI_A_B 3CG0_A_B 3CH5_A_B 3CHI_A_B 3CHX_G_F 3CI0_K_J 3CI6_A_B 3CIT_A_B 3CJD_A_B 3CJH_E_F 3CJH_I_L 3CJI_A_C 3CJL_A_B 3CJS_A_B 3CJT_C_D 3CKD_A_C 3CKI_A_B 3CKY_A_D 3CMB_A_D 3CMM_A_B 3CNH_A_B 3CNY_A_B 3COQ_A_B 3CPH_G_A 3CQ4_A_B 3CQ6_A_C 3CQC_A_B 3CQG_A_B 3CQZ_C_L 3CR3_C_D 3CRC_A_B 3CSW_C_D 3CSY_M_N 3CT6_A_B 3CTM_C_D 3CUE_M_O 3CVJ_A_B 3CVJ_A_C 3CW2_A_K 3CW2_B_L 3CW2_E_M 3CW9_A_B 3CWC_A_B 3CX5_JK_E 3CX6_A_B 3CX7_A_B 3CX8_A_B 3CYJ_A_B 3CYQ_F_I 3D03_C_D 3D0F_A_B 3D0Q_A_B 3D0T_C_D 3D0W_A_C 3D12_A_B 3D1L_A_B 3D32_B_D 3D36_A_B 3D36_A_C 3D3K_A_B 3D3N_A_B 3D46_C_D 3D4I_B_D 3D4R_B_E 3D54_A_D 3D5N_I_H 3D5R_A_C 3D5S_A_C 3D6K_A_B 3D6R_A_B 3D72_A_B 3D7J_E_D 3D7T_A_B 3D7U_A_B 3D85_BA_C 3D87_A_B 3D87_A_C 3D8A_G_F 3D8U_A_B 3D9A_HL_C 3D9R_C_B 3D9X_C_B 3DAE_A_B 3DAH_A_B 3DAH_C_B 3DAK_A_D 3DAL_A_B 3DB0_A_B 3DBI_A_C 3DBO_A_B 3DC1_A_B 3DCG_E_D 3DD9_G_H 3DDC_A_B 3DDH_A_B 3DDM_C_B 3DDT_A_B 3DDV_A_B 3DEP_A_B 3DFE_A_B 3DFZ_A_B 3DGC_L_R 3DGE_B_D 3DH7_C_D 3DHW_C_D 3DI2_A_B 3DI3_A_B 3DI4_A_B 3DIE_A_B 3DKB_D_F 3DKW_C_I 3DL2_A_B 3DL5_A_B 3DLA_B_D 3DLU_A_B 3DMC_A_B 3DN7_A_B 3DNH_A_B 3DNM_A_B 3DNN_C_B 3DO4_D_F 3DO8_A_B 3DOE_A_B 3DOF_A_B 3DP3_B_F 3DP7_A_B 3DPI_A_B 3DPO_C_B 3DPY_A_B 3DQG_A_B 3DR4_A_B 3DRW_A_B 3DRX_C_B 3DS2_A_B 3DS3_A_C 3DSB_A_B 3DTJ_A_B 3DTN_A_B 3DTO_C_D 3DTP_A_E 3DTP_B_D 3DTP_B_F 3DTP_E_F 3DTT_A_B 3DUG_C_H 3DUK_C_B 3DVE_A_B 3DVM_A_B 3DVP_A_B 3DVU_A_C 3DW9_A_B 3DWG_A_C 3DXB_E_G 3DXC_A_B 3DXD_A_B 3DXD_A_C 3DXE_A_B 3DZ2_A_B 3DZA_C_D 3DZC_A_B 3DZM_A_C 3E08_C_D 3E08_G_F 3E0J_C_D 3E0J_C_E 3E0L_A_B 3E17_A_B 3E18_A_B 3E19_A_D 3E1V_A_B 3E2D_A_B 3E40_A_B 3E48_A_B 3E4C_A_B 3E5B_A_C 3E5P_A_C 3E5U_A_B 3E6M_C_D 3E76_M_L 3E7L_A_B 3E96_A_B 3E98_A_B 3E9I_C_D 3EAB_A_G 3EAB_D_J 3EAS_A_B 3EBA_A_B 3EBN_B_D 3ECD_A_D 3ECH_A_C 3ECH_C_B 3ECS_B_H 3EDJ_A_B 3EDM_B_D 3EE7_A_B 3EE9_A_B 3EEY_B_D 3EF2_A_B 3EFY_A_B 3EFZ_A_B 3EG5_A_B 3EGG_A_C 3EGH_A_C 3EGR_A_B 3EGV_A_B 3EH0_C_B 3EH2_A_C 3EH4_A_B 3EHF_A_B 3EHK_A_D 3EIQ_C_D 3EJH_A_E 3EJO_A_B 3ELV_A_B 3EMF_A_B 3EMK_A_B 3EMO_A_C 3EN9_A_B 3EO1_AB_CF 3EO8_C_D 3EOA_LH_I 3EPN_A_B 3EPW_A_B 3EPY_A_B 3EQX_A_B 3ER6_E_F 3ERW_A_B 3ES5_A_B 3ES8_F_H 3ESK_A_B 3ETB_F_J 3EUA_G_H 3EUC_A_B 3EUH_A_D 3EUH_B_E 3EUL_A_D 3EUS_A_B 3EVY_A_B 3EW2_G_F 3EW3_A_B 3EXG_R_T 3EYB_A_D 3EZ0_A_B 3EZ6_A_B 3EZJ_C_D 3EZQ_C_D 3EZY_A_C 3F0N_A_B 3F1I_H_S 3F1P_A_B 3F3S_A_B 3F4C_A_B 3F4N_E_F 3F50_A_B 3F51_D_F 3F5M_A_B 3F5P_C_D 3F62_A_B 3F65_E_H 3F6O_A_B 3F6W_C_D 3F6Z_A_B 3F70_A_B 3F7G_C_B 3F7P_A_C 3F7P_B_D 3F8F_A_B 3F8H_A_B 3F8U_A_B 3F8U_C_B 3F8X_C_D 3F90_A_F 3FA4_G_H 3FA9_A_B 3FAU_C_B 3FBI_B_D 3FBN_C_D 3FBY_A_C 3FBZ_A_C 3FCS_A_B 3FDS_A_C 3FEY_A_C 3FF8_B_D 3FFK_E_D 3FG9_E_F 3FGT_A_B 3FIE_A_C 3FII_A_B 3FIL_A_B 3FIU_C_D 3FJG_C_D 3FJK_A_B 3FKF_A_C 3FKH_A_B 3FLD_A_B 3FLO_E_F 3FMA_C_E 3FMB_A_B 3FMG_HL_A 3FMT_A_B 3FN1_B_A 3FN2_A_B 3FOC_A_B 3FOK_A_H 3FPT_C_B 3FQ6_A_B 3FRW_A_B 3FRY_A_B 3FSH_A_B 3FSH_B_C 3FSH_C_B 3FVM_A_B 3FVU_A_B 3FWC_M_N 3FWE_A_B 3FWS_A_B 3FXA_A_B 3FXD_A_B 3FXD_B_D 3FXT_B_G 3FY6_A_C 3FYB_A_B 3FZ0_B_D 3FZ3_A_C 3FZ7_A_F 3G04_BA_C 3G0B_A_B 3G0F_A_B 3G0I_A_B 3G13_A_B 3G14_A_B 3G16_A_B 3G1W_A_B 3G1Z_A_B 3G2E_A_B 3G2O_A_B 3G33_C_B 3G3A_A_B 3G3B_A_B 3G3R_A_B 3G3Z_A_B 3G5N_A_B 3G5W_E_D 3G67_A_B 3G6D_LH_A 3G6J_E_F 3G7A_A_B 3G7G_A_B 3G7G_C_G 3G7K_A_B 3G7Z_A_C 3G8E_A_B 3G8L_A_C 3G8Q_C_B 3G8R_A_B 3G9A_A_B 3G9K_S_L 3G9W_A_D 3GAA_A_B 3GAG_C_D 3GAS_C_D 3GB8_A_B 3GBN_H_L 3GC3_A_B 3GCF_K_L 3GD1_I_E 3GDH_A_B 3GFA_A_B 3GFD_A_B 3GFK_A_B 3GG8_C_B 3GGF_A_B 3GGJ_A_B 3GI9_HL_C 3GIF_A_B 3GJ3_A_B 3GJ4_A_B 3GJ5_A_B 3GJ6_A_B 3GJ7_A_B 3GJ8_A_B 3GJB_A_B 3GJN_B_D 3GJO_C_D 3GJZ_A_B 3GL1_A_B 3GL9_C_B 3GLC_A_F 3GMA_A_B 3GMJ_A_C 3GNI_A_B 3GOF_B_D 3GOR_C_D 3GOX_A_B 3GPG_C_D 3GQB_C_D 3GQI_A_B 3GRW_HL_A 3GRZ_A_B 3GS2_A_B 3GSD_K_L 3GT8_C_B 3GTY_X_S 3GU3_A_B 3GUY_F_H 3GVI_A_D 3GW6_A_F 3GWH_A_B 3GWL_A_B 3GWN_A_B 3GWR_A_B 3GXG_C_D 3GXW_A_D 3GXX_A_D 3GXY_A_B 3GYD_A_B 3GYR_C_G 3GYR_K_J 3GZ1_A_B 3GZ2_A_B 3GZT_O_Q 3H05_A_B 3H0L_M_O 3H0Q_A_B 3H1Z_A_P 3H2U_A_B 3H2V_A_E 3H3G_A_B 3H3M_A_B 3H42_H_B 3H4E_I_H 3H4M_A_C 3H4S_A_E 3H6G_A_B 3H6H_A_B 3H6K_C_D 3H77_A_B 3H7W_A_B 3H83_C_D 3H87_A_D 3H8K_A_B 3H8L_A_B 3H90_B_D 3H9J_C_D 3HA4_A_E 3HB1_C_B 3HCS_A_B 3HCT_A_B 3HCU_A_B 3HD5_A_C 3HDH_A_B 3HDI_A_B 3HDJ_A_B 3HDO_A_B 3HE3_C_F 3HEF_A_B 3HG0_C_B 3HG9_A_B 3HGU_A_B 3HH0_B_D 3HHH_A_B 3HHI_A_B 3HHW_M_L 3HI0_A_B 3HI1_B_J 3HI1_G_J 3HI2_A_B 3HI6_XY_B 3HIE_C_D 3HIF_A_B 3HIM_A_B 3HJ5_A_B 3HJ9_A_B 3HJP_C_D 3HJU_A_B 3HKB_A_B 3HKL_A_B 3HL4_A_B 3HL6_A_B 3HL9_C_B 3HLI_A_B 3HMX_LH_AB 3HO7_A_B 3HP3_E_G 3HPK_A_B 3HPV_C_B 3HQA_A_B 3HQI_A_B 3HR7_A_B 3HRD_E_F 3HRQ_A_B 3HS2_G_H 3HS3_A_B 3HSE_A_B 3HSH_D_F 3HT4_C_B 3HTA_A_B 3HTU_A_B 3HTU_C_D 3HUG_O_P 3HV0_A_B 3HWC_A_C 3HWP_A_B 3HWS_C_D 3HWS_E_F 3HXJ_A_D 3HXS_A_B 3HY2_A_Y 3HYM_E_F 3HZ4_A_B 3HZO_A_B 3I04_A_B 3I08_C_D 3I38_A_B 3I3W_A_B 3I50_HL_E 3I54_A_B 3I6P_E_D 3I71_A_B 3I7F_A_B 3I7U_C_D 3I9S_C_D 3I9V_E_G 3IA0_I_J 3IA3_A_D 3IA8_A_B 3IAI_A_D 3IAS_1_3 3IAS_D_F 3IAS_S_T 3IAU_A_B 3IB6_B_D 3IBR_A_B 3IC3_C_B 3IC5_A_B 3IDB_A_B 3IDC_A_B 3IDF_A_B 3IDX_HL_G 3IEC_B_F 3IF4_B_D 3IF8_A_B 3IFK_A_B 3IFQ_A_C 3IFS_A_B 3IGF_A_B 3IGM_A_B 3II0_A_D 3IIC_A_B 3IIF_A_B 3IJ6_C_D 3IJM_A_B 3IK5_C_D 3IKK_A_B 3IKO_C_B 3IL2_A_B 3IL4_A_B 3IML_A_B 3IMO_B_D 3IMQ_C_L 3IN6_A_B 3INU_M_L 3IO1_A_B 3IOL_A_B 3IOY_A_B 3IQ2_A_B 3IQE_C_F 3IQQ_A_B 3IR1_A_C 3IR5_A_B 3IRB_A_B 3IS5_E_F 3ISA_D_F 3ISL_A_B 3IT4_B_D 3IUI_A_C 3IUW_A_B 3IVP_A_B 3IWC_A_B 3IWM_A_C 3IWM_B_D 3IX1_A_B 3IX7_A_B 3IX8_C_D 3IXE_A_B 3IXS_A_B 3IXS_C_D 3IYL_D_F 3IZ0_C_D 3IZM_E_F 3J03_A_H 3JRV_A_C 3JSJ_A_B 3JSK_G_H 3JTI_A_B 3JTX_A_B 3JU8_A_B 3JUA_C_D 3JUA_G_H 3JVF_A_B 3JX9_A_B 3JXO_A_B 3JZD_A_B 3K0F_A_F 3K0Z_A_B 3K1I_C_B 3K2M_A_D 3K2U_HL_A 3K2W_A_C 3K33_A_B 3K39_C_B 3K3P_A_B 3K4G_C_D 3K4Y_A_B 3K53_A_B 3K55_O_P 3K5H_A_B 3K67_A_B 3K6C_A_B 3K6C_C_B 3K6E_A_B 3K6G_A_D 3K6Q_C_D 3K6T_C_D 3K74_A_B 3K75_D_B 3K7S_A_B 3K80_A_C 3K8P_C_D 3K90_C_B 3KAE_B_D 3KAJ_A_B 3KAS_A_B 3KB4_C_D 3KBO_A_D 3KBT_A_D 3KCP_A_B 3KCV_I_J 3KDO_C_F 3KDQ_A_C 3KE2_A_B 3KF9_C_D 3KFU_A_B 3KG2_C_D 3KG8_A_B 3KG9_A_B 3KH1_A_B 3KH2_A_E 3KH8_A_B 3KHH_A_B 3KIH_A_B 3KIK_A_E 3KIN_C_D 3KJ0_A_B 3KJ1_A_B 3KJ2_A_B 3KJ4_HL_A 3KJ6_HL_A 3KK4_A_B 3KKD_C_B 3KKI_A_B 3KL5_C_B 3KL9_C_J 3KLS_A_X 3KML_C_G 3KMZ_A_D 3KNB_A_B 3KNW_A_B 3KOC_E_F 3KP1_B_D 3KP1_D_H 3KPH_A_B 3KR3_H_D 3KR3_HL_D 3KS0_HL_B 3KS7_C_D 3KTC_A_B 3KTS_E_D 3KU4_C_D 3KU5_A_B 3KUC_A_B 3KUD_A_B 3KUR_G_H 3KV4_A_B 3KVP_A_F 3KVZ_A_B 3KW0_B_D 3KXE_A_C 3KXY_B_T 3KXY_J_X 3KYG_A_B 3KYI_A_B 3KYJ_A_B 3KYS_C_D 3KZ0_A_C 3KZ1_A_F 3KZ4_C_D 3KZ5_B_E 3KZI_E_D 3KZQ_A_E 3L09_A_B 3L0I_C_D 3L0R_A_B 3L0W_A_B 3L18_A_B 3L2B_A_B 3L31_A_B 3L32_A_B 3L34_G_H 3L5W_LH_I 3L5X_HL_A 3L6Y_A_B 3L7L_B_D 3L7Q_G_I 3L7T_C_B 3L82_A_B 3L89_ABC_M 3L8A_A_B 3L95_HL_Y 3L9F_C_B 3L9K_C_W 3L9W_A_B 3LA2_A_B 3LA6_I_P 3LA7_A_B 3LAO_C_B 3LB5_A_B 3LB6_A_C 3LB8_A_C 3LBS_A_B 3LBX_A_B 3LC8_A_B 3LCB_C_B 3LD8_CB_A 3LED_A_B 3LEE_A_B 3LEV_L_H 3LFK_A_D 3LFR_A_B 3LG2_A_B 3LGA_A_B 3LGS_C_D 3LH2_S_V 3LHR_A_B 3LIS_A_B 3LIZ_HL_A 3LJL_A_B 3LJQ_A_C 3LK2_B_T 3LK4_7_8 3LKU_E_F 3LL4_A_B 3LLK_A_B 3LLM_A_B 3LLS_A_B 3LMA_C_B 3LNL_A_B 3LNN_A_B 3LNZ_E_F 3LO3_O_P 3LOR_C_B 3LOS_A_B 3LOT_B_D 3LOU_C_D 3LOW_A_B 3LP6_A_B 3LQ6_A_B 3LR2_A_B 3LRC_C_D 3LRH_G_H 3LRQ_A_D 3LRU_A_B 3LSB_A_B 3LSJ_A_B 3LTE_C_D 3LTF_A_C 3LUB_I_H 3LVK_AC_B 3LVY_C_D 3LW7_A_B 3LWF_B_D 3LYH_A_B 3LYQ_A_B 3LYV_C_F 3M0Z_C_D 3M17_G_L 3M18_A_B 3M1A_E_D 3M1C_A_B 3M1I_A_C 3M1L_A_B 3M1R_A_C 3M1R_A_F 3M2T_A_B 3M2V_E_F 3M3R_E_D 3M4W_A_C 3M50_A_P 3M5K_A_B 3M5W_A_B 3M63_A_B 3M65_A_B 3M6N_C_B 3M84_A_B 3M8A_I_L 3M8E_A_B 3M8F_A_B 3M8J_A_B 3M8N_A_D 3M8N_B_D 3M92_A_B 3MA2_D_C 3MA9_A_H 3MA9_HL_A 3MAC_HL_A 3MAS_A_B 3MAU_C_D 3MAX_A_B 3MC0_A_B 3MCA_A_B 3MCZ_A_B 3MDO_A_B 3MDW_C_D 3ME2_A_R 3MEN_A_B 3MES_A_B 3MEX_A_B 3MF0_A_B 3MF1_A_B 3MGC_A_B 3MGX_A_B 3MHF_C_D 3MHH_A_B 3MHH_A_E 3MHP_C_B 3MHS_A_D 3MI8_A_D 3MIL_A_B 3MJ7_A_B 3MJH_A_B 3MJK_Y_X 3MJO_A_B 3MJQ_A_B 3MK7_A_B 3MK7_G_I 3MKQ_E_F 3MKR_A_B 3MLG_A_B 3MLI_C_D 3MLQ_A_E 3MMA_A_B 3MMC_B_D 3MMP_A_G 3MMY_E_F 3MMY_E_G 3MO4_A_B 3MOQ_A_C 3MPO_B_D 3MQ0_A_B 3MQ6_A_H 3MQ6_C_F 3MQH_A_B 3MQT_C_F 3MR7_A_C 3MT1_A_B 3MTS_C_B 3MVP_A_B 3MWE_A_B 3MWK_A_B 3MXN_A_B 3MXW_LH_A 3MYR_B_D 3MZG_A_B 3MZK_C_B 3MZK_C_D 3MZL_C_D 3MZL_F_H 3MZO_C_B 3N00_A_B 3N05_A_B 3N06_A_B 3N0P_A_B 3N0V_A_C 3N10_A_B 3N29_A_B 3N2L_E_F 3N2O_A_B 3N2S_C_D 3N3D_A_B 3N40_P_F 3N44_A_B 3N4P_A_B 3N4S_A_B 3N50_E_F 3N5C_A_B 3N5Z_A_B 3N6V_C_D 3N75_B_D 3N7R_C_B 3N84_B_D 3N85_HL_A 3N9X_A_B 3NAP_C_B 3NAU_A_B 3NBN_D_F 3NBS_C_D 3NBT_A_F 3NCB_A_B 3NCC_A_B 3NCY_C_D 3NDH_A_B 3NE2_A_B 3NFC_E_D 3NFG_K_M 3NFW_C_D 3NGF_A_B 3NGZ_A_B 3NH7_KO_D 3NHV_A_B 3NI7_A_B 3NIC_C_G 3NJ2_A_B 3NJA_A_B 3NJC_A_B 3NJH_C_D 3NK3_A_B 3NKH_A_B 3NKZ_C_D 3NL2_B_F 3NM7_A_B 3NMZ_A_C 3NN2_C_B 3NND_C_D 3NO7_A_B 3NOQ_A_B 3NOY_A_B 3NPS_BC_A 3NQN_A_B 3NQO_A_B 3NR1_A_B 3NRT_C_D 3NRV_B_D 3NS6_A_B 3NTE_A_B 3NUI_A_B 3NUT_C_B 3NV8_A_B 3NVA_A_B 3NVI_A_C 3NVN_A_B 3NVQ_A_B 3NVQ_A_E 3NVV_A_B 3NWL_A_B 3NWS_B_D 3NXZ_A_D 3NYB_A_B 3NYM_A_B 3NYN_A_B 3NZP_A_B 3O0E_C_E 3O0L_A_B 3O0N_A_B 3O0R_C_B 3O10_C_D 3O2B_A_B 3O2D_HL_A 3O2I_A_B 3O3M_C_D 3O3P_A_B 3O3Q_A_C 3O3W_E_D 3O40_A_B 3O43_A_B 3O44_K_L 3O5C_A_B 3O5T_A_B 3O61_A_B 3O6B_A_B 3O6Q_A_C 3O78_A_B 3O7X_C_D 3O8O_A_B 3O8O_A_D 3O91_A_D 3OAK_A_D 3OB0_H_M 3OBA_A_C 3OBK_G_F 3OBV_B_E 3OBV_C_D 3OBV_G_H 3OC3_B_D 3OCD_C_D 3ODM_G_F 3ODX_A_B 3OED_A_C 3OED_B_D 3OGH_A_B 3OGI_C_D 3OHM_A_B 3OIQ_A_B 3OJ8_A_B 3OJA_A_B 3OJI_A_B 3OJJ_A_C 3OKY_A_B 3OL0_A_C 3OL2_A_B 3OL3_A_B 3OM1_A_B 3OMT_A_B 3ON0_A_D 3ON0_C_B 3ON3_A_B 3ON5_A_B 3ONA_A_B 3ONL_A_B 3ONW_A_C 3OOQ_H_J 3OPC_A_B 3OPY_A_J 3OPY_D_J 3OPY_E_H 3OPZ_C_J 3OPZ_JN_C 3OQ2_A_B 3OQB_E_D 3OQP_A_B 3OR1_A_E 3OR3_A_B 3OSY_E_D 3OT4_B_F 3OTE_A_B 3OUN_A_B 3OUO_A_B 3OUW_A_B 3OUX_A_B 3OV3_A_B 3OV7_A_B 3OWT_A_C 3OX6_C_D 3OXO_E_F 3OXU_B_F 3OYF_A_B 3OZM_C_E 3P01_C_B 3P0C_A_B 3P0X_B_D 3P0Y_A_H 3P0Y_HL_A 3P16_A_C 3P30_HL_A 3P37_A_E 3P4G_A_B 3P52_A_B 3P57_IJ_P 3P6K_A_B 3P70_E_F 3P71_T_C 3P72_A_B 3P87_A_E 3P8C_A_D 3P8C_A_E 3P8C_A_F 3P8C_D_F 3P9I_C_D 3P9Q_C_B 3P9T_A_B 3PB2_C_B 3PBP_J_L 3PC8_A_C 3PC8_B_D 3PCC_D_P 3PCS_A_E 3PDI_A_B 3PDI_C_B 3PFD_C_D 3PFO_A_B 3PG9_E_H 3PGF_HL_A 3PH0_A_C 3PH1_A_B 3PHA_C_D 3PHF_C_D 3PHT_A_B 3PJA_B_D 3PJN_A_B 3PJS_K_N 3PJV_D_F 3PJZ_A_B 3PK1_A_B 3PKZ_E_F 3PL0_A_B 3PLA_K_M 3PM9_A_B 3PND_B_D 3PNK_A_B 3PNW_TS_U 3PQJ_C_D 3PQK_A_B 3PQR_A_B 3PR7_A_B 3PRB_A_B 3PRU_A_B 3PRU_A_C 3PUK_A_C 3PUT_A_B 3PUV_G_F 3PUZ_B_F 3PUZ_G_F 3PV6_A_B 3PVM_A_B 3PVR_A_C 3PVS_A_C 3PWS_A_B 3PXX_E_D 3PYI_A_B 3PZD_A_B 3Q0V_A_B 3Q0Y_E_F 3Q1P_A_B 3Q24_A_B 3Q31_A_B 3Q3G_HF_I 3Q3Y_A_B 3Q4H_A_B 3Q4U_A_B 3Q58_A_B 3Q6A_A_D 3Q6D_C_D 3Q6I_C_D 3Q6J_A_B 3Q7G_A_B 3Q9C_E_H 3Q9D_A_B 3Q9V_A_B 3QB2_A_B 3QBQ_A_B 3QBR_A_B 3QBT_A_B 3QBT_E_F 3QBU_A_B 3QBV_A_B 3QBX_A_B 3QC9_C_B 3QDK_C_D 3QE9_Y_Z 3QF7_B_D 3QGK_G_I 3QGK_J_R 3QGK_O_R 3QHA_A_B 3QHT_A_C 3QIS_A_B 3QIT_C_D 3QKW_C_B 3QLU_A_C 3QML_A_C 3QML_B_D 3QMW_C_B 3QNI_A_B 3QNR_A_B 3QNR_A_C 3QNW_C_D 3QOE_A_B 3QP8_C_D 3QPB_E_F 3QQ0_A_B 3QQ2_A_B 3QQW_E_F 3QR1_A_D 3QRF_G_F 3QT6_A_B 3QTA_A_B 3QTH_A_B 3QTY_A_B 3QU2_A_D 3QUM_KM_Q 3QVI_A_B 3QW2_A_B 3QWO_AB_C 3QWO_A_C 3QWU_A_B 3QX3_A_B 3QYF_A_B 3QYQ_A_C 3R0Q_A_C 3R1F_A_B 3R1G_HL_B 3R1X_A_B 3R2J_C_D 3R3S_C_D 3R3W_A_B 3R45_A_B 3R4D_A_B 3R4K_A_B 3R4O_A_B 3R4Q_C_D 3R5X_C_D 3R6A_A_B 3R6M_A_D 3R6Q_A_D 3R74_A_B 3R75_A_B 3R84_K_L 3R85_A_E 3R8K_C_B 3R8W_C_D 3R8Y_D_F 3R9A_AC_B 3RAJ_HL_A 3RAM_B_D 3RAM_C_D 3RBB_A_B 3RBB_A_C 3RBL_A_B 3RBN_A_B 3RBX_A_B 3RCY_A_C 3REA_A_B 3REA_C_D 3REB_A_B 3REP_A_B 3RF1_A_B 3RF6_A_B 3RFH_A_C 3RGB_G_F 3RGF_A_B 3RGU_A_B 3RGV_A_B 3RH7_E_F 3RH8_B_D 3RHF_B_D 3RHT_C_B 3RHU_A_B 3RIS_B_D 3RJR_C_D 3RKD_DC_B 3RKO_B_D 3RKO_K_N 3RLB_A_B 3RLQ_A_B 3RM5_A_B 3RMR_A_C 3RMU_C_D 3RO2_A_B 3RPF_C_B 3RPG_B_C 3RPX_C_B 3RRI_A_B 3RRL_C_D 3RRT_C_D 3RSI_C_B 3RTY_G_H 3RUW_A_B 3RV0_A_B 3RV2_A_B 3RV5_C_D 3RVV_DC_A 3RVW_CD_A 3RVX_A_D 3RVZ_A_B 3RWR_G_F 3RZW_D_A 3S19_A_B 3S1J_A_B 3S1M_A_H 3S28_C_B 3S29_C_D 3S2D_A_F 3S35_HL_X 3S35_H_X 3S55_C_B 3S5R_A_B 3S5U_C_E 3S5W_A_B 3S6L_C_B 3S6N_E_2 3S6Z_A_B 3S6Z_C_B 3S7R_A_B 3S97_A_C 3S9D_B_A 3SB1_A_B 3SBQ_A_B 3SC6_A_C 3SCH_A_B 3SDL_A_B 3SDL_A_C 3SE7_E_F 3SE9_HL_G 3SF4_A_B 3SF4_A_D 3SF4_C_F 3SF5_C_D 3SF8_A_B 3SGK_A_B 3SIP_E_D 3SJA_I_J 3SJD_C_D 3SJH_A_B 3SJR_A_B 3SJR_C_D 3SJV_D_E 3SK2_A_B 3SKJ_IM_F 3SKU_A_D 3SL7_A_B 3SLG_A_C 3SLG_C_B 3SN6_A_R 3SO3_CB_A 3SO5_A_B 3SOB_H_B 3SOB_HL_B 3SPS_A_C 3SQD_A_B 3SQL_A_B 3SQN_A_B 3SQO_HL_A 3SRI_A_B 3SRN_A_B 3SSM_C_B 3SSN_B_D 3SSO_C_B 3SSO_C_D 3STB_C_B 3SUA_A_D 3SVK_A_B 3SVR_A_C 3SWC_B_Q 3SXM_A_B 3SXY_A_B 3SYL_A_B 3SYN_A_E 3SZA_A_B 3SZK_A_C 3SZK_DE_F 3SZP_A_B 3T04_A_D 3T07_C_D 3T1B_B_D 3T1F_A_B 3T1Q_C_B 3T2N_IM_B 3T30_G_H 3T38_A_B 3T3X_A_B 3T4E_A_B 3T4N_A_C 3T5P_A_H 3T6G_A_B 3T6O_A_B 3T6O_A_C 3T88_B_F 3T89_B_E 3T8E_A_B 3T8L_A_B 3T91_A_B 3TA1_E_F 3TAC_A_B 3TAD_B_D 3TAI_A_B 3TCX_W_X 3TDK_G_H 3TDU_A_F 3TEO_I_J 3TG1_A_B 3TGN_A_B 3THA_A_B 3THO_A_B 3THX_A_B 3TIX_A_B 3TJB_A_B 3TJR_A_B 3TK1_A_B 3TKL_A_B 3TKR_B_H 3TL3_A_B 3TLF_B_D 3TLF_B_F 3TMK_E_F 3TND_E_F 3TNF_A_B 3TO3_A_B 3TOS_E_I 3TOZ_G_H 3TP4_A_B 3TPU_A_B 3TQC_A_B 3TQT_A_B 3TRJ_C_B 3TS3_B_D 3TS8_A_C 3TSC_C_D 3TSW_C_D 3TT1_HL_B 3TT3_HL_A 3TTX_B_D 3TUZ_E_F 3TV3_H_L 3TW8_C_D 3TW9_A_B 3TWO_A_B 3TXQ_D_G 3TY6_C_E 3TY7_A_B 3TZ1_A_B 3TZB_A_B 3U0H_A_B 3U1D_A_B 3U1J_A_B 3U2E_A_B 3U2S_AB_C 3U30_CB_A 3U33_I_J 3U43_A_B 3U52_A_E 3U5T_A_C 3U5Z_A_B 3U5Z_A_E 3U5Z_O_N 3U60_C_B 3U61_C_B 3U61_F_H 3U7Y_HL_G 3U82_A_B 3U8X_A_B 3U8Z_A_C 3U8Z_B_D 3U9D_A_B 3U9P_KM_C 3U9S_I_J 3U9U_AB_F 3U9Z_A_C 3UAK_A_B 3UBX_HL_A 3UC0_IM_B 3UDB_A_B 3UDI_A_B 3UG6_A_B 3UGV_C_H 3UIN_B_D 3UIP_A_D 3UIP_B_D 3UJ2_C_B 3UJG_A_B 3UK7_A_B 3UKV_A_B 3UKW_B_C 3UKX_B_C 3UKZ_B_C 3UL0_B_C 3UL1_B_A 3UL4_A_B 3ULA_A_D 3ULQ_A_B 3UO2_A_B 3UO3_A_B 3UPT_A_B 3UX9_A_B 3UYO_A_D 3UYP_A_B 3UZ0_A_B 3UZE_A_C 3UZQ_A_B 3V1C_A_B 3V4Y_A_B 3V6B_A_R 3V6O_CE_A 3V6Z_AB_F 3V7A_EH_A 3VCB_A_B 3VEP_X_D 3VG8_E_F 3VG9_CB_A 3VGK_E_H 3VH0_B_D 3VH3_A_B 3VI4_FE_B 3VLB_A_B 3VRL_HL_C 3VV2_A_B 3W2D_HL_A 3W8H_A_B 3W8I_A_B 3W9E_AB_C 3WA0_A_G 3WKM_IM_B 3WKT_A_C 3WLW_HL_B 3WO3_A_B 3WQB_A_B 3WRX_A_C 3WRY_A_C 3WSQ_HL_A 3WWN_A_B 3X3F_HL_A 3ZET_A_B 3ZEU_D_E 3ZJY_E_D 3ZKM_CD_B 3ZKQ_A_D 3ZNZ_A_B 3ZO0_A_B 3ZQ4_A_E 3ZQ4_E_D 3ZQP_C_B 3ZRJ_A_X 3ZRK_A_X 3ZRX_A_B 3ZS9_C_B 3ZTG_A_B 3ZU7_A_B 3ZUP_A_B 3ZUV_A_B 3ZV0_B_D 3ZV0_C_D 3ZVK_D_G 3ZVQ_A_B 3ZWZ_A_B 3ZXQ_A_B 3ZYI_A_B 3ZYJ_A_B 3ZYL_A_B 3ZZV_A_B 4A1S_B_E 4A1U_A_B 4A49_A_B 4AEI_HL_A 4AG4_HL_A 4AL8_HL_C 4AP2_A_B 4APX_A_B 4AQE_A_B 4AWX_A_B 4B4S_A_B 4BFI_A_B 4BKX_A_B 4BOH_B_A 4BPX_C_D 4BRU_A_B 4BRW_A_B 4BYF_C_D 4BZ1_HL_A 4BZ2_HL_A 4C2A_A_B 4C2B_A_B 4C4K_T_O 4C4P_A_B 4C5G_A_B 4C7N_A_B 4C9B_A_B 4CAD_HG_I 4CC4_A_B 4CJ2_B_C 4CMH_BC_A 4CNI_HL_C 4CT0_A_B 4CU4_A_B 4CVW_A_C 4D0G_A_C 4D0N_A_B 4D3C_HL_A 4D9Q_ED_B 4DAG_HL_A 4DBG_A_B 4DH2_A_B 4DID_A_B 4DJ9_A_B 4DKE_IM_B 4DKF_HL_A 4DM6_A_E 4DM8_A_C 4DN4_LH_M 4DS8_A_B 4DT1_A_B 4DTG_HL_K 4DVG_A_B 4DX8_A_J 4DXA_A_B 4DZU_A_B 4DZV_A_B 4E42_A_B 4EDW_HL_V 4EDX_HL_V 4EHQ_A_G 4EIZ_A_D 4EKC_A_B 4EKD_A_B 4ENE_EF_B 4EOZ_A_B 4ERS_HL_A 4ETP_A_B 4ETW_A_B 4EUK_A_B 4EXP_A_X 4F15_HI_G 4F2M_CD_F 4F37_HL_A 4F38_A_B 4F48_A_B 4F9L_A_B 4F9P_A_B 4FFV_DC_B 4FFY_HL_A 4FQ0_B_C 4FQI_HL_ABEFCD 4FQJ_HL_A 4FZV_A_B 4G01_A_B 4G35_A_B 4G59_A_C 4G6J_HL_A 4G6M_HL_A 4G6V_A_B 4G7V_HL_S 4G80_EF_T 4GAF_B_A 4GAM_AFBGCH_D 4GEH_A_B 4GIQ_A_R 4GLA_A_D 4GLV_A_B 4GN3_A_B 4GN4_B_A 4GN5_A_D 4GNK_A_B 4GXU_MN_ABEFCD 4H03_A_B 4H3P_A_B 4H5S_A_B 4H6J_A_B 4H88_HL_A 4H8W_HL_G 4HC1_MN_B 4HCN_A_B 4HCP_A_B 4HCR_HL_A 4HEP_A_G 4HF5_HL_A 4HFF_A_B 4HFU_HL_A 4HGK_A_D 4HGM_B_A 4HJ0_PQ_A 4HKX_AB_E 4HRL_C_A 4HT1_HL_T 4HX3_BD_A 4I0C_A_D 4I18_HL_C 4I77_HL_Z 4IC7_A_B 4IDJ_HL_A 4IJ3_CB_A 4IKA_A_D 4IOS_D_H 4IRZ_HL_A 4IU3_A_B 4IYP_A_C 4IZ7_A_B 4J2L_A_C 4J32_A_B 4J4P_HL_A 4J6G_A_C 4J6R_HL_G 4JB9_HL_G 4JCV_ADBC_E 4JDT_HL_G 4JE4_A_B 4JEG_A_B 4JEH_A_B 4JEU_A_B 4JLR_HL_S 4JPV_HL_G 4JPW_HL_G 4JR9_HL_A 4JS0_A_B 4JW2_A_B 4JZJ_HL_C 4K0A_A_R 4K2U_IM_B 4K3J_HL_B 4K5A_A_B 4K5B_D_A 4K81_A_B 4K9E_HL_C 4KA2_A_R 4KI5_EF_M 4KJY_A_B 4KT1_A_E 4KT3_A_B 4KUC_FE_I 4KVG_A_B 4KVN_HL_A 4L5F_HL_E 4LEO_AB_C 4LGP_A_B 4LGR_A_B 4LIQ_HL_E 4LMQ_HL_D 4LQF_HL_A 4LSP_HL_G 4LST_HL_G 4LSU_HL_G 4LU5_IM_A 4LVH_HI_G 4LVN_CB_A 4LW4_AB_C 4LZX_A_B 4M1L_A_B 4M62_HL_S 4M6B_A_C 4M76_A_B 4MHH_JK_A 4MHJ_L_H 4MI8_A_C 4MIT_A_E 4MJS_A_B 4ML7_A_B 4MP0_A_B 4MQV_A_B 4MRT_C_A 4MWF_HL_C 4MXV_FE_B 4MYW_A_B 4N7Z_A_B 4NE9_A_P 4NIQ_A_C 4NL9_A_C 4NM3_A_B 4NNP_HL_A 4NP4_HL_A 4NQW_A_B 4NU1_A_B 4NZR_HL_M 4O9H_HL_A 4OD2_BA_S 4OFY_A_D 4OII_HL_A 4OJK_A_C 4OKV_CD_E 4OL0_A_B 4OLZ_HL_G 4OM1_HL_G 4ONS_A_B 4OQT_HL_A 4OVN_A_F 4OYD_A_B 4P3Y_A_B 4P59_HL_A 4P5T_A_B 4PAS_A_B 4PBV_A_C 4PBW_B_E 4PBZ_A_B 4PC0_A_C 4PER_A_B 4PGJ_A_B 4PLJ_DC_B 4PLO_B_A 4PS4_HL_A 4PVZ_A_C 4PW9_A_B 4PZ6_A_Q 4Q5U_A_C 4Q6I_ED_J 4Q96_D_E 4QCI_HL_C 4QHU_BA_D 4QLP_A_B 4QRP_K_L 4QVF_A_B 4QWW_DC_B 4QXA_A_B 4RAU_ED_F 4RDQ_GF_E 4RE1_A_D 4REY_A_B 4RGM_HL_S 4RGN_FG_S 4RGO_HL_S 4RJF_A_B 4RT6_A_B 4RWS_A_C 4RWT_A_D 4RWY_HL_A 4RX4_HL_G 4S0S_A_D 4S1Q_HL_G 4S1R_HL_G 4S1S_HL_G 4TNW_IO_D 4TSB_HL_A 4TSC_HL_A 4TTD_HL_A 4U0Q_A_B 4U0R_BC_A 4U1G_BC_A 4U2X_A_D 4U32_X_A 4U4C_A_B 4U6H_AB_E 4U6V_HL_A 4UAO_CB_A 4UEM_A_B 4UF1_A_B 4UI1_D_A 4UT6_IM_B 4UT9_JN_D 4UU9_AB_C 4UV7_HL_A 4UWX_A_C 4UYQ_A_B 4V1D_DE_C 4V2C_A_B 4W6W_A_B 4W6Y_A_B 4WEU_D_B 4WFF_ED_A 4WND_A_B 4WNN_A_B 4WV1_BA_C 4WWI_A_D 4X33_A_B 4X7S_H_L 4XAK_HL_A 4XHU_C_D 4XKL_A_B 4XNQ_BA_D 4XNY_HL_G 4XNZ_EF_D 4XOI_A_B 4XP4_HL_A 4XTR_EF_A 4XVP_A_D 4XVT_HL_G 4XWJ_A_B 4Y5O_A_B 4Y5V_DE_F 4Y5X_JK_L 4Y5Y_DE_F 4Y61_A_B 4YBQ_FE_A 4YC7_A_B 4YDI_HL_G 4YDK_HL_G 4YDL_HL_G 4YE4_HL_G 4YFL_FI_E 4YH7_A_B 4YIQ_A_B 4YIZ_A_B 4YJ4_A_B 4YK4_CB_A 4YL8_A_B 4YOC_A_C 4YPG_BA_C 4YPI_C_G 4YVQ_A_C 4YWG_IM_Q 4YYP_A_B 4Z5R_BA_N 4Z80_A_C 4ZFG_HL_A 4ZGM_A_B 4ZGQ_A_B 4ZGY_A_B 4ZI2_A_C 4ZII_A_C 4ZLT_B_F 4ZPT_HL_S 4ZRJ_A_B 4ZRK_A_E 4ZRP_A_C 4ZS6_CD_B 4ZS7_HL_A 4ZSO_BA_E 4ZV4_A_C 4ZXB_CD_E 5AAM_A_C 5AAW_A_C 5ABV_A_B 5AGW_B_C 5AGX_A_D 5AJJ_A_B 5ANM_BA_G 5B3J_EF_C 5B64_A_B 5B71_BA_E 5BJZ_CL_A 5BK1_CD_B 5BK2_CD_B 5BN5_A_B 5BNQ_A_R 5BO1_IM_A 5BOZ_A_G 5BV7_HL_A 5BW7_A_B 5C0N_HL_A 5C3F_A_B 5C6T_HL_A 5C8J_AB_I 5CMN_A_E 5CSC_A_B 5CTR_A_C 5CUS_HL_A 5CXB_A_B 5CYK_A_B 5CZF_A_D 5CZV_HL_A 5CZX_HL_A 5D1Q_CD_E 5D1X_CD_E 5D1Z_DC_I 5D5M_A_B 5D70_HL_A 5D71_HL_A 5D72_MN_B 5D7L_A_B 5D8J_HL_A 5D93_CB_A 5D96_JI_D 5DC4_A_B 5DCQ_C_F 5DFV_EF_B 5DFW_A_H 5DHV_AB_N 5DJU_B_A 5DMI_HL_A 5DO2_CD_B 5DOB_A_B 5DUM_HL_A 5DUP_HL_A 5DUR_HL_C 5E6P_A_B 5E8E_BA_H 5E94_BA_G 5E95_B_A 5EE5_A_B 5EG3_A_B 5EII_HL_G 5EN2_AB_C 5EO9_A_B 5EP6_A_B 5ESV_AB_E 5ET1_A_C 5EU7_EC_A 5F3B_AB_C 5F3H_AB_J 5F5S_A_B 5F96_HL_G 5F9O_HL_G 5F9W_HL_G 5FB8_BA_C 5FCU_HL_G 5FR1_A_B 5FR2_A_B 5FV2_X_A 5FVK_A_C 5FZT_A_B 5GGS_AB_Z 5GGT_HL_A 5GGV_HL_Y 5GLH_A_B 5GMQ_BC_A 5GS0_FE_B 5GZO_HL_A 5H35_FG_E 5HBT_DC_B 5HDQ_HL_A 5HI5_CD_A 5HPS_A_B 5HPY_A_B 5HVF_A_B 5HVG_A_B 5I9Q_BC_A 5IJ9_A_B 5IKC_BA_M 5IMT_A_D 5IP4_A_E 5IUS_A_C 5IXD_A_B 5J13_CB_A 5J3H_CD_E 5J4A_A_B 5J56_A_B 5J57_A_B 5J7C_A_C 5J8H_A_B 5JG6_A_B 5JHL_HL_A 5JQ6_HL_A 5JSB_A_B 5JSN_A_B 5JZ7_CD_A 5JZE_B_A 5K59_HL_A 5K8Q_A_B 5K9O_HL_I 5KAQ_FG_C 5KJR_HL_G 5KTE_HL_A 5KVD_HL_E 5KVE_HL_E 5KVF_HL_E 5KVG_HL_E 5KW9_HL_A 5L0Q_FE_D 5L6Y_HL_C 5L8J_A_B 5LBS_HL_A 5LDN_HL_A 5LI1_A_B 5LQB_HL_A 5LRW_A_B 5LSP_ST_P 5LWY_HL_A 5LXM_A_D 5LXQ_B_A 5MES_HL_A 5MHR_KJ_C 5MO9_HL_X 5MVZ_HL_U 5NMV_HL_K 5NUZ_AB_C 5O4G_BA_C 5O4O_BA_C 5OB5_HL_A 5OCC_HL_A 5SV3_A_B 5SX5_HL_N 5SY8_HL_O 5SZH_A_B 5SZI_A_B 5SZJ_A_B 5SZK_A_B 5T29_HL_O 5T33_HL_G 5T3Z_DE_G 5T5B_HL_E 5T5F_HL_A 5TAR_A_B 5TE7_HL_G 5TFW_HL_O 5TH9_HL_A 5TIH_HL_A 5TL5_HL_A 5TLJ_DC_X 5TLK_HG_Y 5TPN_HL_A 5TRU_HL_C 5TUD_CB_A 5TZ2_HL_C 5TZT_HL_C 5TZU_HL_C 5U8R_HL_A 5UCB_HL_B 5UDC_EG_D 5UEA_HL_D 5UEM_HL_G 5UG0_DC_A 5UMN_CD_B 5UOE_PQ_C 5USH_HL_X 5USL_BC_A 5UTZ_JK_I 5VAG_CB_A 5VCN_FE_A 5VEB_AB_X 5VIC_HL_E 5VIG_AB_G 5VJQ_GH_L 5VL7_HL_B 5VLP_HL_A 5VYF_HL_F 5W06_HL_T 5W08_OP_E 5W0D_BC_A 5W0K_HL_A 5W1K_DC_E 5W2B_HL_A 5W5Z_HL_A 5W6D_HL_G 5W6G_HL_A 5WB9_HL_G 5WI9_HL_A 5XBM_BA_C 5XHV_PQ_A 5XIM_A_D 5XJ4_HL_A 5XKU_CB_A 5XMH_DC_B 5XWD_HD_A 5XXY_HL_A 5Y9F_VU_F 5YOY_HE_C 5YY5_HL_A 6ALD_C_B 6AOD_BA_C 6AQ7_HL_A 6ATT_HL_A 6AYZ_RC_M 6AZZ_CB_A 6B08_CB_A 6B0A_HL_A 6B0E_BA_E 6B0G_DC_E 6B0H_BA_J 6B9J_HL_X 6BCK_HL_G 6BDZ_HL_A 6BF4_BC_A 6BIT_JL_G 6BP2_HL_A 6BPA_BC_A 6BPE_EF_D 6C6Z_CD_A 6C9U_HL_A 6CH7_QR_G 6CK9_DE_B 6CYF_UT_Q 6ELU_EF_D 6FAX_HL_R 6PFK_C_D 6REQ_C_D 7CEI_A_B 7MDH_A_B ================================================ FILE: main_inference.py ================================================ # Standard imports: import numpy as np import torch from torch.utils.tensorboard import SummaryWriter from torch.utils.data import random_split from torch_geometric.data import DataLoader from torch_geometric.transforms import Compose from pathlib import Path # Custom data loader and model: from data import ProteinPairsSurfaces, PairData, CenterPairAtoms, load_protein_pair from data import RandomRotationPairAtoms, NormalizeChemFeatures, iface_valid_filter from model import dMaSIF from data_iteration import iterate from helper import * from Arguments import parser args = parser.parse_args() model_path = "models/" + args.experiment_name save_predictions_path = Path("preds/" + args.experiment_name) # Ensure reproducability: torch.backends.cudnn.deterministic = True torch.manual_seed(args.seed) torch.cuda.manual_seed_all(args.seed) np.random.seed(args.seed) # Load the train and test datasets: transformations = ( Compose([NormalizeChemFeatures(), CenterPairAtoms(), RandomRotationPairAtoms()]) if args.random_rotation else Compose([NormalizeChemFeatures()]) ) if args.single_pdb != "": single_data_dir = Path("./data_preprocessing/npys/") test_dataset = [load_protein_pair(args.single_pdb, single_data_dir,single_pdb=True)] test_pdb_ids = [args.single_pdb] elif args.pdb_list != "": with open(args.pdb_list) as f: pdb_list = f.read().splitlines() single_data_dir = Path("./data_preprocessing/npys/") test_dataset = [load_protein_pair(pdb, single_data_dir,single_pdb=True) for pdb in pdb_list] test_pdb_ids = [pdb for pdb in pdb_list] else: test_dataset = ProteinPairsSurfaces( "surface_data", train=False, ppi=args.search, transform=transformations ) test_pdb_ids = ( np.load("surface_data/processed/testing_pairs_data_ids.npy") if args.site else np.load("surface_data/processed/testing_pairs_data_ids_ppi.npy") ) test_dataset = [ (data, pdb_id) for data, pdb_id in zip(test_dataset, test_pdb_ids) if iface_valid_filter(data) ] test_dataset, test_pdb_ids = list(zip(*test_dataset)) # PyTorch geometric expects an explicit list of "batched variables": batch_vars = ["xyz_p1", "xyz_p2", "atom_coords_p1", "atom_coords_p2"] test_loader = DataLoader( test_dataset, batch_size=args.batch_size, follow_batch=batch_vars ) net = dMaSIF(args) # net.load_state_dict(torch.load(model_path, map_location=args.device)) net.load_state_dict( torch.load(model_path, map_location=args.device)["model_state_dict"] ) net = net.to(args.device) # Perform one pass through the data: info = iterate( net, test_loader, None, args, test=True, save_path=save_predictions_path, pdb_ids=test_pdb_ids, ) #np.save(f"timings/{args.experiment_name}_convtime.npy", info["conv_time"]) #np.save(f"timings/{args.experiment_name}_memoryusage.npy", info["memory_usage"]) ================================================ FILE: main_training.py ================================================ # Standard imports: import numpy as np import torch from torch.utils.tensorboard import SummaryWriter from torch.utils.data import random_split from torch_geometric.data import DataLoader from torch_geometric.transforms import Compose from pathlib import Path # Custom data loader and model: from data import ProteinPairsSurfaces, PairData, CenterPairAtoms from data import RandomRotationPairAtoms, NormalizeChemFeatures, iface_valid_filter from model import dMaSIF from data_iteration import iterate, iterate_surface_precompute from helper import * from Arguments import parser # Parse the arguments, prepare the TensorBoard writer: args = parser.parse_args() writer = SummaryWriter("runs/{}".format(args.experiment_name)) model_path = "models/" + args.experiment_name if not Path("models/").exists(): Path("models/").mkdir(exist_ok=False) # Ensure reproducibility: torch.backends.cudnn.deterministic = True torch.manual_seed(args.seed) torch.cuda.manual_seed_all(args.seed) np.random.seed(args.seed) # Create the model, with a warm restart if applicable: net = dMaSIF(args) net = net.to(args.device) # We load the train and test datasets. # Random transforms, to ensure that no network/baseline overfits on pose parameters: transformations = ( Compose([NormalizeChemFeatures(), CenterPairAtoms(), RandomRotationPairAtoms()]) if args.random_rotation else Compose([NormalizeChemFeatures()]) ) # PyTorch geometric expects an explicit list of "batched variables": batch_vars = ["xyz_p1", "xyz_p2", "atom_coords_p1", "atom_coords_p2"] # Load the train dataset: train_dataset = ProteinPairsSurfaces( "surface_data", ppi=args.search, train=True, transform=transformations ) train_dataset = [data for data in train_dataset if iface_valid_filter(data)] train_loader = DataLoader( train_dataset, batch_size=1, follow_batch=batch_vars, shuffle=True ) print("Preprocessing training dataset") train_dataset = iterate_surface_precompute(train_loader, net, args) # Train/Validation split: train_nsamples = len(train_dataset) val_nsamples = int(train_nsamples * args.validation_fraction) train_nsamples = train_nsamples - val_nsamples train_dataset, val_dataset = random_split( train_dataset, [train_nsamples, val_nsamples] ) # Load the test dataset: test_dataset = ProteinPairsSurfaces( "surface_data", ppi=args.search, train=False, transform=transformations ) test_dataset = [data for data in test_dataset if iface_valid_filter(data)] test_loader = DataLoader( test_dataset, batch_size=1, follow_batch=batch_vars, shuffle=True ) print("Preprocessing testing dataset") test_dataset = iterate_surface_precompute(test_loader, net, args) # PyTorch_geometric data loaders: train_loader = DataLoader( train_dataset, batch_size=1, follow_batch=batch_vars, shuffle=True ) val_loader = DataLoader(val_dataset, batch_size=1, follow_batch=batch_vars) test_loader = DataLoader(test_dataset, batch_size=1, follow_batch=batch_vars) # Baseline optimizer: optimizer = torch.optim.Adam(net.parameters(), lr=3e-4, amsgrad=True) best_loss = 1e10 # We save the "best model so far" starting_epoch = 0 if args.restart_training != "": checkpoint = torch.load("models/" + args.restart_training) net.load_state_dict(checkpoint["model_state_dict"]) optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) starting_epoch = checkpoint["epoch"] best_loss = checkpoint["best_loss"] # Training loop (~100 times) over the dataset: for i in range(starting_epoch, args.n_epochs): # Train first, Test second: for dataset_type in ["Train", "Validation", "Test"]: if dataset_type == "Train": test = False else: test = True suffix = dataset_type if dataset_type == "Train": dataloader = train_loader elif dataset_type == "Validation": dataloader = val_loader elif dataset_type == "Test": dataloader = test_loader # Perform one pass through the data: info = iterate( net, dataloader, optimizer, args, test=test, summary_writer=writer, epoch_number=i, ) # Write down the results using a TensorBoard writer: for key, val in info.items(): if key in [ "Loss", "ROC-AUC", "Distance/Positives", "Distance/Negatives", "Matching ROC-AUC", ]: writer.add_scalar(f"{key}/{suffix}", np.mean(val), i) if "R_values/" in key: val = np.array(val) writer.add_scalar(f"{key}/{suffix}", np.mean(val[val > 0]), i) if dataset_type == "Validation": # Store validation loss for saving the model val_loss = np.mean(info["Loss"]) if True: # Additional saves if val_loss < best_loss: print("Validation loss {}, saving model".format(val_loss)) torch.save( { "epoch": i, "model_state_dict": net.state_dict(), "optimizer_state_dict": optimizer.state_dict(), "best_loss": best_loss, }, model_path + "_epoch{}".format(i), ) best_loss = val_loss ================================================ FILE: model.py ================================================ import math import time import torch import torch.nn as nn import torch.nn.functional as F import torch.autograd.profiler as profiler from pykeops.torch import LazyTensor from geometry_processing import ( curvatures, mesh_normals_areas, tangent_vectors, atoms_to_points_normals, ) from helper import soft_dimension, diagonal_ranges from benchmark_models import DGCNN_seg, PointNet2_seg, dMaSIFConv_seg def knn_atoms(x, y, x_batch, y_batch, k): N, D = x.shape x_i = LazyTensor(x[:, None, :]) y_j = LazyTensor(y[None, :, :]) pairwise_distance_ij = ((x_i - y_j) ** 2).sum(-1) pairwise_distance_ij.ranges = diagonal_ranges(x_batch, y_batch) # N.B.: KeOps doesn't yet support backprop through Kmin reductions... # dists, idx = pairwise_distance_ij.Kmin_argKmin(K=k,axis=1) # So we have to re-compute the values ourselves: idx = pairwise_distance_ij.argKmin(K=k, axis=1) # (N, K) x_ik = y[idx.view(-1)].view(N, k, D) dists = ((x[:, None, :] - x_ik) ** 2).sum(-1) return idx, dists def get_atom_features(x, y, x_batch, y_batch, y_atomtype, k=16): idx, dists = knn_atoms(x, y, x_batch, y_batch, k=k) # (num_points, k) num_points, _ = idx.size() idx = idx.view(-1) dists = 1 / dists.view(-1, 1) _, num_dims = y_atomtype.size() feature = y_atomtype[idx, :] feature = torch.cat([feature, dists], dim=1) feature = feature.view(num_points, k, num_dims + 1) return feature class Atom_embedding(nn.Module): def __init__(self, args): super(Atom_embedding, self).__init__() self.D = args.atom_dims self.k = 16 self.conv1 = nn.Linear(self.D + 1, self.D) self.conv2 = nn.Linear(self.D, self.D) self.conv3 = nn.Linear(2 * self.D, self.D) self.bn1 = nn.BatchNorm1d(self.D) self.bn2 = nn.BatchNorm1d(self.D) self.relu = nn.LeakyReLU(negative_slope=0.2) def forward(self, x, y, y_atomtypes, x_batch, y_batch): fx = get_atom_features(x, y, x_batch, y_batch, y_atomtypes, k=self.k) fx = self.conv1(fx) fx = fx.view(-1, self.D) fx = self.bn1(self.relu(fx)) fx = fx.view(-1, self.k, self.D) fx1 = fx.sum(dim=1, keepdim=False) fx = self.conv2(fx) fx = fx.view(-1, self.D) fx = self.bn2(self.relu(fx)) fx = fx.view(-1, self.k, self.D) fx2 = fx.sum(dim=1, keepdim=False) fx = torch.cat((fx1, fx2), dim=-1) fx = self.conv3(fx) return fx class AtomNet(nn.Module): def __init__(self, args): super(AtomNet, self).__init__() self.args = args self.transform_types = nn.Sequential( nn.Linear(args.atom_dims, args.atom_dims), nn.LeakyReLU(negative_slope=0.2), nn.Linear(args.atom_dims, args.atom_dims), nn.LeakyReLU(negative_slope=0.2), nn.Linear(args.atom_dims, args.atom_dims), nn.LeakyReLU(negative_slope=0.2), ) self.embed = Atom_embedding(args) def forward(self, xyz, atom_xyz, atomtypes, batch, atom_batch): # Run a DGCNN on the available information: atomtypes = self.transform_types(atomtypes) return self.embed(xyz, atom_xyz, atomtypes, batch, atom_batch) class Atom_embedding_MP(nn.Module): def __init__(self, args): super(Atom_embedding_MP, self).__init__() self.D = args.atom_dims self.k = 16 self.n_layers = 3 self.mlp = nn.ModuleList( [ nn.Sequential( nn.Linear(2 * self.D + 1, 2 * self.D + 1), nn.LeakyReLU(negative_slope=0.2), nn.Linear(2 * self.D + 1, self.D), ) for i in range(self.n_layers) ] ) self.norm = nn.ModuleList( [nn.GroupNorm(2, self.D) for i in range(self.n_layers)] ) self.relu = nn.LeakyReLU(negative_slope=0.2) def forward(self, x, y, y_atomtypes, x_batch, y_batch): idx, dists = knn_atoms(x, y, x_batch, y_batch, k=self.k) # N, 9, 7 num_points = x.shape[0] num_dims = y_atomtypes.shape[-1] point_emb = torch.ones_like(x[:, 0])[:, None].repeat(1, num_dims) for i in range(self.n_layers): features = y_atomtypes[idx.reshape(-1), :] features = torch.cat([features, dists.reshape(-1, 1)], dim=1) features = features.view(num_points, self.k, num_dims + 1) features = torch.cat( [point_emb[:, None, :].repeat(1, self.k, 1), features], dim=-1 ) # N, 8, 13 messages = self.mlp[i](features) # N,8,6 messages = messages.sum(1) # N,6 point_emb = point_emb + self.relu(self.norm[i](messages)) return point_emb class Atom_Atom_embedding_MP(nn.Module): def __init__(self, args): super(Atom_Atom_embedding_MP, self).__init__() self.D = args.atom_dims self.k = 17 self.n_layers = 3 self.mlp = nn.ModuleList( [ nn.Sequential( nn.Linear(2 * self.D + 1, 2 * self.D + 1), nn.LeakyReLU(negative_slope=0.2), nn.Linear(2 * self.D + 1, self.D), ) for i in range(self.n_layers) ] ) self.norm = nn.ModuleList( [nn.GroupNorm(2, self.D) for i in range(self.n_layers)] ) self.relu = nn.LeakyReLU(negative_slope=0.2) def forward(self, x, y, y_atomtypes, x_batch, y_batch): idx, dists = knn_atoms(x, y, x_batch, y_batch, k=self.k) # N, 9, 7 idx = idx[:, 1:] # Remove self dists = dists[:, 1:] k = self.k - 1 num_points = y_atomtypes.shape[0] out = y_atomtypes for i in range(self.n_layers): _, num_dims = out.size() features = out[idx.reshape(-1), :] features = torch.cat([features, dists.reshape(-1, 1)], dim=1) features = features.view(num_points, k, num_dims + 1) features = torch.cat( [out[:, None, :].repeat(1, k, 1), features], dim=-1 ) # N, 8, 13 messages = self.mlp[i](features) # N,8,6 messages = messages.sum(1) # N,6 out = out + self.relu(self.norm[i](messages)) return out class AtomNet_MP(nn.Module): def __init__(self, args): super(AtomNet_MP, self).__init__() self.args = args self.transform_types = nn.Sequential( nn.Linear(args.atom_dims, args.atom_dims), nn.LeakyReLU(negative_slope=0.2), nn.Linear(args.atom_dims, args.atom_dims), ) self.embed = Atom_embedding_MP(args) self.atom_atom = Atom_Atom_embedding_MP(args) def forward(self, xyz, atom_xyz, atomtypes, batch, atom_batch): # Run a DGCNN on the available information: atomtypes = self.transform_types(atomtypes) atomtypes = self.atom_atom( atom_xyz, atom_xyz, atomtypes, atom_batch, atom_batch ) atomtypes = self.embed(xyz, atom_xyz, atomtypes, batch, atom_batch) return atomtypes def combine_pair(P1, P2): P1P2 = {} for key in P1: v1 = P1[key] v2 = P2[key] if v1 is None: continue if key == "batch" or key == "batch_atoms": v1v2 = torch.cat([v1, v2 + v1[-1] + 1], dim=0) elif key == "triangles": # v1v2 = torch.cat([v1,v2],dim=1) continue else: v1v2 = torch.cat([v1, v2], dim=0) P1P2[key] = v1v2 return P1P2 def split_pair(P1P2): batch_size = P1P2["batch_atoms"][-1] + 1 p1_indices = P1P2["batch"] < batch_size // 2 p2_indices = P1P2["batch"] >= batch_size // 2 p1_atom_indices = P1P2["batch_atoms"] < batch_size // 2 p2_atom_indices = P1P2["batch_atoms"] >= batch_size // 2 P1 = {} P2 = {} for key in P1P2: v1v2 = P1P2[key] if (key == "rand_rot") or (key == "atom_center"): n = v1v2.shape[0] // 2 P1[key] = v1v2[:n].view(-1, 3) P2[key] = v1v2[n:].view(-1, 3) elif "atom" in key: P1[key] = v1v2[p1_atom_indices] P2[key] = v1v2[p2_atom_indices] elif key == "triangles": continue # P1[key] = v1v2[:,p1_atom_indices] # P2[key] = v1v2[:,p2_atom_indices] else: P1[key] = v1v2[p1_indices] P2[key] = v1v2[p2_indices] P2["batch"] = P2["batch"] - batch_size + 1 P2["batch_atoms"] = P2["batch_atoms"] - batch_size + 1 return P1, P2 def project_iface_labels(P, threshold=2.0): queries = P["xyz"] batch_queries = P["batch"] source = P["mesh_xyz"] batch_source = P["mesh_batch"] labels = P["mesh_labels"] x_i = LazyTensor(queries[:, None, :]) # (N, 1, D) y_j = LazyTensor(source[None, :, :]) # (1, M, D) D_ij = ((x_i - y_j) ** 2).sum(-1).sqrt() # (N, M) D_ij.ranges = diagonal_ranges(batch_queries, batch_source) nn_i = D_ij.argmin(dim=1).view(-1) # (N,) nn_dist_i = ( D_ij.min(dim=1).view(-1, 1) < threshold ).float() # If chain is not connected because of missing densities MaSIF cut out a part of the protein query_labels = labels[nn_i] * nn_dist_i P["labels"] = query_labels class dMaSIF(nn.Module): def __init__(self, args): super(dMaSIF, self).__init__() # Additional geometric features: mean and Gauss curvatures computed at different scales. self.curvature_scales = args.curvature_scales self.args = args I = args.in_channels O = args.orientation_units E = args.emb_dims H = args.post_units # Computes chemical features self.atomnet = AtomNet_MP(args) self.dropout = nn.Dropout(args.dropout) if args.embedding_layer == "dMaSIF": # Post-processing, without batch norm: self.orientation_scores = nn.Sequential( nn.Linear(I, O), nn.LeakyReLU(negative_slope=0.2), nn.Linear(O, 1), ) # Segmentation network: self.conv = dMaSIFConv_seg( args, in_channels=I, out_channels=E, n_layers=args.n_layers, radius=args.radius, ) # Asymmetric embedding if args.search: self.orientation_scores2 = nn.Sequential( nn.Linear(I, O), nn.LeakyReLU(negative_slope=0.2), nn.Linear(O, 1), ) self.conv2 = dMaSIFConv_seg( args, in_channels=I, out_channels=E, n_layers=args.n_layers, radius=args.radius, ) elif args.embedding_layer == "DGCNN": self.conv = DGCNN_seg(I + 3, E,self.args.n_layers,self.args.k) if args.search: self.conv2 = DGCNN_seg(I + 3, E,self.args.n_layers,self.args.k) elif args.embedding_layer == "PointNet++": self.conv = PointNet2_seg(args, I, E) if args.search: self.conv2 = PointNet2_seg(args, I, E) if args.site: # Post-processing, without batch norm: self.net_out = nn.Sequential( nn.Linear(E, H), nn.LeakyReLU(negative_slope=0.2), nn.Linear(H, H), nn.LeakyReLU(negative_slope=0.2), nn.Linear(H, 1), ) def features(self, P, i=1): """Estimates geometric and chemical features from a protein surface or a cloud of atoms.""" if ( not self.args.use_mesh and "xyz" not in P ): # Compute the pseudo-surface directly from the atoms # (Note that we use the fact that dicts are "passed by reference" here) P["xyz"], P["normals"], P["batch"] = atoms_to_points_normals( P["atoms"], P["batch_atoms"], atomtypes=P["atomtypes"], resolution=self.args.resolution, sup_sampling=self.args.sup_sampling, ) # Estimate the curvatures using the triangles or the estimated normals: P_curvatures = curvatures( P["xyz"], triangles=P["triangles"] if self.args.use_mesh else None, normals=None if self.args.use_mesh else P["normals"], scales=self.curvature_scales, batch=P["batch"], ) # Compute chemical features on-the-fly: chemfeats = self.atomnet( P["xyz"], P["atom_xyz"], P["atomtypes"], P["batch"], P["batch_atoms"] ) if self.args.no_chem: chemfeats = 0.0 * chemfeats if self.args.no_geom: P_curvatures = 0.0 * P_curvatures # Concatenate our features: return torch.cat([P_curvatures, chemfeats], dim=1).contiguous() def embed(self, P): """Embeds all points of a protein in a high-dimensional vector space.""" features = self.dropout(self.features(P)) P["input_features"] = features torch.cuda.synchronize(device=features.device) torch.cuda.reset_max_memory_allocated(device=P["atoms"].device) begin = time.time() # Ours: if self.args.embedding_layer == "dMaSIF": self.conv.load_mesh( P["xyz"], triangles=P["triangles"] if self.args.use_mesh else None, normals=None if self.args.use_mesh else P["normals"], weights=self.orientation_scores(features), batch=P["batch"], ) P["embedding_1"] = self.conv(features) if self.args.search: self.conv2.load_mesh( P["xyz"], triangles=P["triangles"] if self.args.use_mesh else None, normals=None if self.args.use_mesh else P["normals"], weights=self.orientation_scores2(features), batch=P["batch"], ) P["embedding_2"] = self.conv2(features) # First baseline: elif self.args.embedding_layer == "DGCNN": features = torch.cat([features, P["xyz"]], dim=-1).contiguous() P["embedding_1"] = self.conv(P["xyz"], features, P["batch"]) if self.args.search: P["embedding_2"] = self.conv2( P["xyz"], features, P["batch"] ) # Second baseline elif self.args.embedding_layer == "PointNet++": P["embedding_1"] = self.conv(P["xyz"], features, P["batch"]) if self.args.search: P["embedding_2"] = self.conv2(P["xyz"], features, P["batch"]) torch.cuda.synchronize(device=features.device) end = time.time() memory_usage = torch.cuda.max_memory_allocated(device=P["atoms"].device) conv_time = end - begin return conv_time, memory_usage def preprocess_surface(self, P): P["xyz"], P["normals"], P["batch"] = atoms_to_points_normals( P["atoms"], P["batch_atoms"], atomtypes=P["atomtypes"], resolution=self.args.resolution, sup_sampling=self.args.sup_sampling, distance=self.args.distance, ) if P['mesh_labels'] is not None: project_iface_labels(P) def forward(self, P1, P2=None): # Compute embeddings of the point clouds: if P2 is not None: P1P2 = combine_pair(P1, P2) else: P1P2 = P1 conv_time, memory_usage = self.embed(P1P2) # Monitor the approximate rank of our representations: R_values = {} R_values["input"] = soft_dimension(P1P2["input_features"]) R_values["conv"] = soft_dimension(P1P2["embedding_1"]) if self.args.site: P1P2["iface_preds"] = self.net_out(P1P2["embedding_1"]) if P2 is not None: P1, P2 = split_pair(P1P2) else: P1 = P1P2 return { "P1": P1, "P2": P2, "R_values": R_values, "conv_time": conv_time, "memory_usage": memory_usage, } ================================================ FILE: requirements.txt ================================================ absl-py==0.11.0 appdirs==1.4.4 argon2-cffi==20.1.0 ase==3.20.1 async-generator==1.10 attrs==20.3.0 backcall==0.2.0 biopython==1.78 black==20.8b1 bleach==3.2.1 cached-property==1.5.2 cachetools==4.1.1 certifi==2020.6.20 cffi==1.14.3 chardet==3.0.4 click==7.1.2 cloudpickle==1.6.0 cycler==0.10.0 dask==2020.12.0 decorator==4.4.2 defusedxml==0.6.0 entrypoints==0.3 future==0.18.2 google-auth==1.23.0 google-auth-oauthlib==0.4.2 googledrivedownloader==0.4 GPUtil==1.4.0 grpcio==1.33.2 h5py==3.0.0 idna==2.10 importlib-metadata==2.0.0 ipykernel==5.3.4 ipython==7.19.0 ipython-genutils==0.2.0 ipywidgets==7.5.1 isodate==0.6.0 jedi==0.17.2 Jinja2==2.11.2 joblib==0.17.0 jsonschema==3.2.0 jupyter==1.0.0 jupyter-client==6.1.7 jupyter-console==6.2.0 jupyter-core==4.6.3 jupyterlab-pygments==0.1.2 kaleido==0.0.3.post1 kiwisolver==1.3.1 llvmlite==0.34.0 Markdown==3.3.3 MarkupSafe==1.1.1 matplotlib==3.3.2 mistune==0.8.4 mypy-extensions==0.4.3 nbclient==0.5.1 nbconvert==6.0.7 nbformat==5.0.8 nest-asyncio==1.4.3 networkx==2.5 notebook==6.1.5 numba==0.51.2 numpy==1.19.3 oauthlib==3.1.0 packaging==20.4 pandas==1.1.4 pandocfilters==1.4.3 parso==0.7.1 pathspec==0.8.1 pexpect==4.8.0 pickleshare==0.7.5 Pillow==8.0.1 plotly==4.13.0 plyfile==0.7.2 prometheus-client==0.8.0 prompt-toolkit==3.0.8 protobuf==3.13.0 ptyprocess==0.6.0 pyasn1==0.4.8 pyasn1-modules==0.2.8 pycparser==2.20 Pygments==2.7.2 pykeops==1.4.1 pyparsing==2.4.7 pyrsistent==0.17.3 python-dateutil==2.8.1 pytz==2020.4 PyVTK==0.5.18 PyYAML==5.3.1 pyzmq==19.0.2 qtconsole==4.7.7 QtPy==1.9.0 rdflib==5.0.0 regex==2020.11.13 requests==2.24.0 requests-oauthlib==1.3.0 retrying==1.3.3 rope==0.18.0 rsa==4.6 scikit-learn==0.23.2 scipy==1.5.3 seaborn==0.11.0 Send2Trash==1.5.0 six==1.15.0 tensorboard==2.3.0 tensorboard-plugin-wit==1.7.0 terminado==0.9.1 testpath==0.4.4 threadpoolctl==2.1.0 toml==0.10.2 toolz==0.11.1 torch==1.6.0 torch-cluster==1.5.8 torch-geometric==1.6.1 torch-scatter==2.0.5 torch-sparse==0.6.8 torch-spline-conv==1.2.0 tornado==6.1 tqdm==4.51.0 traitlets==5.0.5 typed-ast==1.4.1 typing-extensions==3.7.4.3 urllib3==1.25.11 wcwidth==0.2.5 webencodings==0.5.1 Werkzeug==1.0.1 widgetsnbextension==3.5.1 zipp==3.4.0