|
from typing import Optional |
|
|
|
import pandas as pd |
|
from pandas.core.frame import DataFrame |
|
from sqlalchemy import Integer, String, create_engine |
|
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column |
|
|
|
|
|
class Base(DeclarativeBase): |
|
pass |
|
|
|
|
|
class Dataset(Base): |
|
"""Dataset table""" |
|
|
|
__tablename__ = "datasets" |
|
|
|
id: Mapped[int] = mapped_column("id", Integer, autoincrement=True, primary_key=True) |
|
name: Mapped[str] = mapped_column("name", String, unique=True) |
|
path: Mapped[str] = mapped_column("path", String) |
|
config_file: Mapped[str] = mapped_column("config_file", String) |
|
train_rows: Mapped[int] = mapped_column("train_rows", Integer) |
|
validation_rows: Mapped[Optional[int]] = mapped_column( |
|
"validation_rows", Integer, nullable=True |
|
) |
|
|
|
|
|
class Experiment(Base): |
|
"""Experiment table""" |
|
|
|
__tablename__ = "experiments" |
|
|
|
id: Mapped[int] = mapped_column("id", Integer, primary_key=True) |
|
name: Mapped[str] = mapped_column("name", String) |
|
mode: Mapped[str] = mapped_column("mode", String) |
|
dataset: Mapped[str] = mapped_column("dataset", String) |
|
config_file: Mapped[str] = mapped_column("config_file", String) |
|
path: Mapped[str] = mapped_column("path", String) |
|
seed: Mapped[int] = mapped_column("seed", Integer) |
|
process_id: Mapped[int] = mapped_column("process_id", Integer) |
|
gpu_list: Mapped[str] = mapped_column("gpu_list", String) |
|
|
|
|
|
class Database: |
|
"""Class for managing database.""" |
|
|
|
def __init__(self, path_db: str) -> None: |
|
"""Initialize database |
|
|
|
Args: |
|
path_db: path to sqlite database file |
|
""" |
|
|
|
self.__engine__ = create_engine(f"sqlite:///{path_db}") |
|
Base.metadata.create_all(self.__engine__) |
|
self._session = Session(self.__engine__) |
|
|
|
def add_dataset(self, dataset: Dataset) -> None: |
|
"""Add a dataset to the table |
|
|
|
Args: |
|
dataset: dataset to add |
|
""" |
|
self._session.add(dataset) |
|
self._session.commit() |
|
|
|
def delete_dataset(self, id: int) -> None: |
|
"""Delete a dataset from the table |
|
|
|
Args: |
|
id: dataset id to delete |
|
""" |
|
|
|
dataset = self._session.query(Dataset).get(int(id)) |
|
self._session.delete(dataset) |
|
self._session.commit() |
|
|
|
def get_dataset(self, id: int) -> Dataset: |
|
"""Return dataset given an id |
|
|
|
Args: |
|
id: dataset id to return |
|
|
|
Returns: |
|
Dataset with given id |
|
""" |
|
|
|
return self._session.query(Dataset).get(int(id)) |
|
|
|
def get_datasets_df(self) -> DataFrame: |
|
"""Return dataframe containing all datasets |
|
|
|
Returns: |
|
All datasets |
|
""" |
|
|
|
datasets = pd.read_sql(self._session.query(Dataset).statement, self.__engine__) |
|
return datasets.sort_values("id", ascending=False) |
|
|
|
def add_experiment(self, experiment: Experiment) -> None: |
|
"""Add an experiment to the table |
|
|
|
Args: |
|
experiment: experiment to add |
|
""" |
|
|
|
self._session.add(experiment) |
|
self._session.commit() |
|
|
|
def delete_experiment(self, id: int) -> None: |
|
"""Delete an experiment from the table |
|
|
|
Args: |
|
id: experiment id to delete |
|
""" |
|
|
|
experiment = self._session.query(Experiment).get(int(id)) |
|
self._session.delete(experiment) |
|
self._session.commit() |
|
|
|
def get_experiment(self, id: int) -> Experiment: |
|
"""Return experiment given an id |
|
|
|
Args: |
|
id: experiment id to return |
|
|
|
Returns: |
|
Experiment with given id |
|
""" |
|
|
|
return self._session.query(Experiment).get(int(id)) |
|
|
|
def get_experiments_df(self) -> DataFrame: |
|
"""Return dataframe containing all experiments |
|
|
|
Returns: |
|
All experiments |
|
""" |
|
|
|
experiments = pd.read_sql( |
|
self._session.query(Experiment).statement, self.__engine__ |
|
) |
|
return experiments.sort_values("id", ascending=False) |
|
|
|
def rename_experiment(self, id: int, new_name: str, new_path: str) -> None: |
|
"""Rename experiment given id and new name |
|
|
|
Args: |
|
id: experiment id |
|
new_name: new name |
|
""" |
|
|
|
experiment = self.get_experiment(id) |
|
experiment.name = new_name |
|
experiment.path = new_path |
|
self._session.commit() |
|
|
|
def update(self) -> None: |
|
self._session.commit() |
|
|