Source code for piel.experimental.file_system
"""
This file contains all functionality required to verify the corresponding measurement file structure and the
mapping between measurement data, configuration ids, and the file structure accordingly. The goal would be to create
a direct mapping between an operating setup configuration, or experiment.
"""
from ..types import PathTypes
from piel.types.experimental import Experiment
from ..file_system import (
create_new_directory,
return_path,
write_model_to_json,
)
from .text import write_experiment_top_markdown
import logging
logger = logging.getLogger(__name__)
[docs]
def construct_experiment_directories(
experiment: Experiment,
parent_directory: PathTypes,
construct_directory: bool = True,
write_schema_markdown: bool = False,
) -> PathTypes:
"""
This function constructs the directories of the experiment configuration. It iterates through the experiment
instances. It checks that each of these instances is unique. Each experiment.experiment_instance should have a
unique name. This directory name is an enumerated integer. This enumerated integer is the index of the experiment
instance in the experiment.experiment_instances tuple. This function should be able to create a new experiment
configuration from scratch.
A parent directory is defined in which to create the experiment directories. The experiment directory is created
in the parent directory. The experiment directory contains the experiment.json file. The experiment.json file
contains the experiment configuration. Note that the experiment.json file should be recursive.
The experiment directory also contains the experiment instances. The
experiment instances are directories. Each experiment instance directory contains the instance.json file. The
instance.json file contains the experiment instance configuration. This is as flat as the directory structure gets.
The instance directory will contain the data files alongside all of this metadata information.
The data files are at the top level of the instance directory, and should not have subdirectories.
The data files are manually generated from the corresponding measurements specified in the instance.json file.
These will be added after wards from this directory structure creation.
This schema is used to generate a README file for the experiment configuration if `write_markdown_schema` is true. This README file should contain
all the information about the experiment configuration. This includes the experiment instances and their
corresponding configurations.
Parameters
----------
experiment : Experiment
The experiment configuration to create the directories for.
parent_directory : PathTypes
The parent directory to create the experiment directory in.
write_markdown_schema : bool
Writes the json schema into markdown if true. Defaults to false.
Returns
-------
PathTypes
The path to the experiment directory.
"""
parent_directory = return_path(parent_directory)
# Create the experiment directory
experiment_directory = parent_directory / experiment.name
if (experiment_directory.exists()) and not construct_directory:
input(
"The directory already exists. Press enter to continue and overwrite all the json and configuration "
"files."
)
else:
create_new_directory(experiment_directory)
logger.debug(
"construct_experiment_directories: Creating experiment directory at %s",
experiment_directory,
)
# Create the experiment.json file
experiment_json_path = experiment_directory / "experiment.json"
write_model_to_json(experiment, experiment_json_path)
logger.debug(
"construct_experiment_directories: Writing experiment configuration to %s",
experiment_json_path,
)
# Create the experiment README.md file
experiment_markdown_path = experiment_directory / "README.md"
setup_experiment_markdown_path = experiment_directory / "SETUP.md"
write_experiment_top_markdown(
experiment, experiment_directory, experiment_markdown_path
)
write_experiment_top_markdown(
experiment, experiment_directory, setup_experiment_markdown_path
)
logger.debug(
"construct_experiment_directories: Writing experiment markdown to %s",
experiment_markdown_path,
)
if write_schema_markdown:
# Append schema to markdown
write_schema_markdown(experiment_json_path, experiment_markdown_path)
write_schema_markdown(experiment_json_path, setup_experiment_markdown_path)
# Create the experiment instances
for index, experiment_instance in enumerate(experiment.experiment_instances):
# Create the experiment instance directory
experiment_instance_directory = experiment_directory / str(index)
create_new_directory(experiment_instance_directory)
# Create the instance.json file
instance_json_path = experiment_instance_directory / "instance.json"
instance_markdown_path = experiment_instance_directory / "README.md"
write_model_to_json(experiment_instance, instance_json_path)
if write_schema_markdown:
write_schema_markdown(instance_json_path, instance_markdown_path)
logger.debug(
"construct_experiment_directories: Finished creating experiment instances at %s",
experiment_directory,
)
print(f"Experiment directory created at {experiment_directory}")
return experiment_directory
[docs]
def construct_experiment_structure(experiment: Experiment, parent_directory: PathTypes):
"""
The goal of this function is to construct both the directories and the json file which defines both the experiment
and all the experiment instances. It should be able to create a new experiment configuration from scratch.
"""