Source code for ecnet.datasets.load_data

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)