Coverage for src/sparkle/CLI/add_instances.py: 93%
58 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-08 12:00 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-08 12:00 +0000
1#!/usr/bin/env python3
2"""Sparkle command to add an instance set to the Sparkle platform."""
4import sys
5import argparse
6from pathlib import Path
7import shutil
9from sparkle.CLI.help import global_variables as gv
10from sparkle.platform import file_help as sfh
11from sparkle.instance import Instance_Set
12from sparkle.structures import FeatureDataFrame, PerformanceDataFrame
13from sparkle.CLI.help import logging as sl
15from sparkle.CLI.initialise import check_for_initialise
16from sparkle.CLI.help import argparse_custom as ac
17from sparkle.CLI.help import jobs as jobs_help
20def parser_function() -> argparse.ArgumentParser:
21 """Define the command line arguments."""
22 parser = argparse.ArgumentParser(description="Add instances to the platform.")
23 parser.add_argument(
24 *ac.InstancesPathArgument.names, **ac.InstancesPathArgument.kwargs
25 )
26 parser.add_argument(
27 *ac.NicknameInstanceSetArgument.names, **ac.NicknameInstanceSetArgument.kwargs
28 )
29 parser.add_argument(*ac.NoCopyArgument.names, **ac.NoCopyArgument.kwargs)
30 return parser
33def main(argv: list[str]) -> None:
34 """Main function of the add instances command."""
35 # Log command call
36 sl.log_command(sys.argv, gv.settings().random_state)
38 # Define command line arguments
39 parser = parser_function()
40 check_for_initialise()
42 # Process command line arguments
43 args = parser.parse_args(argv)
44 instances_source = Path(args.instances_path)
45 instances_target = gv.settings().DEFAULT_instance_dir / instances_source.name
47 if not instances_source.exists():
48 print(f'Instance set path "{instances_source}" does not exist!')
49 sys.exit(-1)
50 if instances_target.exists():
51 print(
52 f'Instance set "{instances_source.name}" already exists in Sparkle! '
53 "Exiting..."
54 )
55 sys.exit(-1)
56 if args.nickname is not None:
57 sfh.add_remove_platform_item(
58 instances_target,
59 gv.instances_nickname_path,
60 gv.file_storage_data_mapping[gv.instances_nickname_path],
61 key=args.nickname,
62 )
64 print(f"Start adding all instances in directory {instances_source} ...")
65 new_instance_set = Instance_Set(instances_source)
67 if args.no_copy:
68 print(f"Creating symbolic link from {instances_source} to {instances_target}...")
69 instances_target.symlink_to(instances_source.absolute())
70 else:
71 instances_target.mkdir(parents=True)
72 print("Copying files...")
73 for instance_path_source in new_instance_set.all_paths:
74 print(f"Copying {instance_path_source} to {instances_target}...", end="\r")
75 shutil.copy(instance_path_source, instances_target)
76 print("\nCopying done!")
77 # Refresh the instance set as the target instance set
78 new_instance_set = Instance_Set(instances_target)
80 jobs_help.check_running_waiting_jobs(
81 gv.settings().DEFAULT_log_output,
82 )
84 # Add the instances to the Feature Data / Performance Data
85 feature_data = FeatureDataFrame(gv.settings().DEFAULT_feature_data_path)
86 # When adding instances, an empty performance DF has no objectives yet
87 performance_data = PerformanceDataFrame(
88 gv.settings().DEFAULT_performance_data_path,
89 objectives=gv.settings().objectives,
90 )
91 instance_pairs = new_instance_set.instance_pairs
92 feature_data.add_instance(instance_pairs)
93 performance_data.add_instance(instance_pairs)
94 feature_data.save_csv()
95 performance_data.save_csv()
97 print(f"Adding instance set {new_instance_set.name} done!")
99 # Write used settings to file
100 gv.settings().write_used_settings()
101 sys.exit(0)
104if __name__ == "__main__":
105 main(sys.argv[1:])