r"""Pre-bundled data interface"""
from os import path
from typing import List, Tuple, Union
from .structs import QSPRDatasetFromFile
_DATA_PATH = path.join(path.dirname(path.abspath(__file__)), "data")
def _open_smiles_file(smiles_fn: str) -> List[str]:
"""
Args:
smiles_fn (str): filename/path for SMILES file
Returns:
list[str]: [smiles_0, ..., smiles_N]
"""
with open(smiles_fn, "r") as smi_file:
smiles = smi_file.readlines()
smi_file.close()
smiles = [s.replace("\n", "") for s in smiles]
return smiles
def _open_target_file(target_fn: str) -> List[List[float]]:
"""
Args:
target_fn (str): filename/path for target values file
Returns:
list[list[float]]: lists of target values, in preparation for torch.tensor of shape
(n_targets, 1)
"""
with open(target_fn, "r") as tar_file:
target = tar_file.readlines()
tar_file.close()
target = [[float(t.replace("\n", ""))] for t in target]
return target
def _get_prop_paths(prop: str) -> Tuple[str, str]:
"""
Args:
prop (str): any in ['bp', 'cn', 'cp', 'kv', 'lhv', 'mon', 'pp', 'ron', 'ysi', 'mp']
Returns:
tuple[str, str]: (path to smiles file (str), path to targets file (str))
"""
return (
path.join(_DATA_PATH, "{}.smiles".format(prop)),
path.join(_DATA_PATH, "{}.target".format(prop)),
)
def _get_file_data(prop: str) -> Tuple[List[str], List[List[float]]]:
"""
Args:
prop (str): any in ['bp', 'cn', 'cp', 'kv', 'lhv', 'mon', 'pp', 'ron', 'ysi', 'mp']
Returns:
tuple[list[str], list[list[float]]]: (smiles, targets)
"""
fn_smiles, fn_target = _get_prop_paths(prop)
smiles = _open_smiles_file(fn_smiles)
target = _open_target_file(fn_target)
return (smiles, target)
def _load_set(prop: str, backend: str) -> QSPRDatasetFromFile:
"""
Args:
prop (str): any in ['bp', 'cn', 'cp', 'kv', 'lhv', 'mon', 'pp', 'ron', 'ysi', 'mp']
Returns:
QSPRDatasetFromFile: loaded set
"""
fn_smiles, fn_target = _get_prop_paths(prop)
target_vals = _open_target_file(fn_target)
return QSPRDatasetFromFile(fn_smiles, target_vals, backend)
[docs]
def load_bp(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load boiling point data; target values given in Celsius
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("bp")
return _load_set("bp", backend)
[docs]
def load_cn(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load cetane number data; target values given in CN units
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("cn")
return _load_set("cn", backend)
[docs]
def load_cp(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load cloud point data; target values given in Celsius
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("cp")
return _load_set("cp", backend)
[docs]
def load_kv(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load kinematic viscosity data; target values given in mm^2/s (cSt) at 313 deg. K
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("kv")
return _load_set("kv", backend)
[docs]
def load_lhv(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load lower heating value data; target values given in MJ/kg = kJ/g
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("lhv")
return _load_set("lhv", backend)
[docs]
def load_mon(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load motor octane number data; target values given in MON units
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("mon")
return _load_set("mon", backend)
[docs]
def load_mp(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load melting point data; target values given in Celsius
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("mp")
return _load_set("mp", backend)
[docs]
def load_pp(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load pour point data; target values given in Celsius
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("pp")
return _load_set("pp", backend)
[docs]
def load_ron(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load research octane number data; target values given in RON units
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("ron")
return _load_set("ron", backend)
[docs]
def load_ysi(
as_dataset: bool = False, backend: str = "padel"
) -> Union[Tuple[List[str], List[List[float]]], QSPRDatasetFromFile]:
"""
Load yield sooting index data; target values given in unified YSI units
Parameters
----------
as_dataset : bool, optional
If True, return a ``QSPRDatasetFromFile``; otherwise return SMILES and targets.
backend : str, optional
Descriptor backend: ``padel`` or ``alvadesc``.
Returns
-------
tuple or QSPRDatasetFromFile
SMILES/target pair or dataset object.
"""
if not as_dataset:
return _get_file_data("ysi")
return _load_set("ysi", backend)