


import multiprocessing
from typing import TYPE_CHECKING, Optional, Union

from .. import Dataset, Features, config
from ..formatting import query_table
from ..packaged_modules.sql.sql import Sql
from ..utils import logging
from .abc import AbstractDatasetInputStream


if TYPE_CHECKING:
			import sqlitea

			import sqlalchemy

class     a		(_lowerCAmelCase				):




							"""simple docstring"""


							def __init__(							self	:  List[str]   ,     lowerCamelCase	:  Union[str, "sqlalchemy.sql.Selectable"]   ,     lowerCamelCase	:  Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"]   ,     lowerCamelCase	:  Optional[Features] = None   ,     lowerCamelCase	:  str = None   ,     lowerCamelCase	:  bool = False   ,     **lowerCamelCase	:  Optional[int]   ,     )     ->   List[Any]:
														super().__init__(features=lowerCamelCase   ,     cache_dir=lowerCamelCase   ,     keep_in_memory=lowerCamelCase   ,     **lowerCamelCase    )
														__snake_case		:      Union[str, Any]										=       Sql(
														    cache_dir=lowerCamelCase   ,     features=lowerCamelCase   ,     sql=lowerCamelCase   ,     con=lowerCamelCase   ,     **lowerCamelCase   ,     )






							def    __snake_case (							self	:  Dict    )     ->   List[Any]:
														__snake_case		:      Dict										=       None
														__snake_case		:      List[str]										=       None
														__snake_case		:      List[str]										=       None
														__snake_case		:      str										=       None

														self.builder.download_and_prepare(
														    download_config=lowerCamelCase   ,     download_mode=lowerCamelCase   ,     verification_mode=lowerCamelCase   ,     base_path=lowerCamelCase   ,     )

														# Build dataset for splits
														__snake_case		:      List[str]										=       self.builder.as_dataset(
														    split="train"   ,     verification_mode=lowerCamelCase   ,     in_memory=self.keep_in_memory    )
														return dataset

class     a		:




							"""simple docstring"""


							def __init__(							self	:  Optional[Any]   ,     lowerCamelCase	:  Dataset   ,     lowerCamelCase	:  str   ,     lowerCamelCase	:  Union[str, "sqlalchemy.engine.Connection", "sqlalchemy.engine.Engine", "sqlite3.Connection"]   ,     lowerCamelCase	:  Optional[int] = None   ,     lowerCamelCase	:  Optional[int] = None   ,     **lowerCamelCase	:  str   ,     )     ->   Optional[int]:
														if num_proc is not None and num_proc <= 0:
																					raise ValueError(F'num_proc {num_proc} must be an integer > 0.'    )

														__snake_case		:      List[Any]										=       dataset
														__snake_case		:      int										=       name
														__snake_case		:      int										=       con
														__snake_case		:      Dict										=       batch_size if batch_size else config.DEFAULT_MAX_BATCH_SIZE
														__snake_case		:      Optional[Any]										=       num_proc
														__snake_case		:      str										=       to_sql_kwargs

							def    __snake_case (							self	:  Any    )     ->   int:
														__snake_case		:      Tuple										=       self.to_sql_kwargs.pop("sql"   ,     lowerCamelCase    )
														__snake_case		:      Any										=       self.to_sql_kwargs.pop("con"   ,     lowerCamelCase    )
														__snake_case		:      Optional[Any]										=       self.to_sql_kwargs.pop("index"   ,     lowerCamelCase    )

														__snake_case		:      List[Any]										=       self._write(index=lowerCamelCase   ,     **self.to_sql_kwargs    )
														return written

							def    __snake_case (							self	:  Optional[int]   ,     lowerCamelCase	:  Any    )     ->   List[Any]:
														__snake_case		:      List[str]										=       args
														__snake_case		:      Any										=       {**to_sql_kwargs, "if_exists": "append"} if offset > 0 else to_sql_kwargs
														__snake_case		:      str										=       query_table(
														    table=self.dataset.data   ,     key=slice(lowerCamelCase   ,     offset + self.batch_size    )   ,     indices=self.dataset._indices   ,     )
														__snake_case		:      Tuple										=       batch.to_pandas()
														__snake_case		:      Dict										=       df.to_sql(self.name   ,     self.con   ,     index=lowerCamelCase   ,     **lowerCamelCase    )
														return num_rows or len(lowerCamelCase    )






							def    __snake_case (							self	:  int   ,     lowerCamelCase	:  List[str]   ,     **lowerCamelCase	:  Any    )     ->   int:
														__snake_case		:      Dict										=       0

														if self.num_proc is None or self.num_proc == 1:
																					for offset in logging.tqdm(
																					    range(0   ,     len(self.dataset    )   ,     self.batch_size    )   ,     unit="ba"   ,     disable=not logging.is_progress_bar_enabled()   ,     desc="Creating SQL from Arrow format"   ,     ):
																												written += self._batch_sql((offset, index, to_sql_kwargs)    )
														else:
																					__snake_case		:      Optional[Any]										=       len(self.dataset    ), self.batch_size
																					with multiprocessing.Pool(self.num_proc    ) as pool:
																												for num_rows in logging.tqdm(
																												    pool.imap(
																												        self._batch_sql   ,     [(offset, index, to_sql_kwargs) for offset in range(0   ,     lowerCamelCase   ,     lowerCamelCase    )]   ,     )   ,     total=(num_rows // batch_size) + 1 if num_rows % batch_size else num_rows // batch_size   ,     unit="ba"   ,     disable=not logging.is_progress_bar_enabled()   ,     desc="Creating SQL from Arrow format"   ,     ):
																																			written += num_rows

														return written





from typing import Dict

import numpy as np
import torch

from . import residue_constants as rc
from .tensor_utils import tensor_tree_map, tree_map







def     lowerCAmelCase_					( __lowerCamelCase     ):
							__snake_case		:      Any										=       []
							__snake_case		:      Optional[Any]										=       []
							__snake_case		:      List[Any]										=       []

							for rt in rc.restypes:
														__snake_case		:      Any										=       rc.restype_name_to_atomaa_names[rc.restype_atoa[rt]]
														restype_atomaa_to_atomaa_list.append([(rc.atom_order[name] if name else 0) for name in atom_names]     )
														__snake_case		:      Tuple										=       {name: i for i, name in enumerate(__lowerCamelCase     )}
														restype_atomaa_to_atomaa_list.append(
														    [(atom_name_to_idxaa[name] if name in atom_name_to_idxaa else 0) for name in rc.atom_types]     )

														restype_atomaa_mask_list.append([(1.0 if name else 0.0) for name in atom_names]     )

							# Add dummy mapping for restype 'UNK'
							restype_atomaa_to_atomaa_list.append([0] * 1_4     )
							restype_atomaa_to_atomaa_list.append([0] * 3_7     )
							restype_atomaa_mask_list.append([0.0] * 1_4     )

							__snake_case		:      int										=       torch.tensor(
							    __lowerCamelCase							,     dtype=torch.intaa							,     device=protein["aatype"].device							,     )
							__snake_case		:      List[str]										=       torch.tensor(
							    __lowerCamelCase							,     dtype=torch.intaa							,     device=protein["aatype"].device							,     )
							__snake_case		:      Optional[Any]										=       torch.tensor(
							    __lowerCamelCase							,     dtype=torch.floataa							,     device=protein["aatype"].device							,     )
							__snake_case		:      Optional[int]										=       protein["aatype"].to(torch.long     )

							# create the mapping for (residx, atom14) --> atom37, i.e. an array
							# with shape (num_res, 14) containing the atom37 indices for this protein
							__snake_case		:      Optional[Any]										=       restype_atomaa_to_atomaa[protein_aatype]
							__snake_case		:      Tuple										=       restype_atomaa_mask[protein_aatype]

							__snake_case		:      Optional[Any]										=       residx_atomaa_mask
							__snake_case		:      Union[str, Any]										=       residx_atomaa_to_atomaa.long()

							# create the gather indices for mapping back
							__snake_case		:      Dict										=       restype_atomaa_to_atomaa[protein_aatype]
							__snake_case		:      Dict										=       residx_atomaa_to_atomaa.long()

							# create the corresponding mask
							__snake_case		:      List[str]										=       torch.zeros([2_1, 3_7]							,     dtype=torch.floataa							,     device=protein["aatype"].device     )
							for restype, restype_letter in enumerate(rc.restypes     ):
														__snake_case		:      List[str]										=       rc.restype_atoa[restype_letter]
														__snake_case		:      List[Any]										=       rc.residue_atoms[restype_name]
														for atom_name in atom_names:
																					__snake_case		:      Union[str, Any]										=       rc.atom_order[atom_name]
																					__snake_case		:      str										=       1

							__snake_case		:      List[str]										=       restype_atomaa_mask[protein_aatype]
							__snake_case		:      List[str]										=       residx_atomaa_mask

							return protein







def     lowerCAmelCase_					( __lowerCamelCase     ):
							__snake_case		:      str										=       tree_map(lambda __lowerCamelCase     : torch.tensor(__lowerCamelCase							,     device=batch["aatype"].device     )							,     __lowerCamelCase							,     np.ndarray     )
							__snake_case		:      str										=       tensor_tree_map(lambda __lowerCamelCase     : np.array(__lowerCamelCase     )							,     make_atomaa_masks(__lowerCamelCase     )     )
							return out

