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

1#!/usr/bin/env python3 

2"""Sparkle command to add an instance set to the Sparkle platform.""" 

3 

4import sys 

5import argparse 

6from pathlib import Path 

7import shutil 

8 

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 

14 

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 

18 

19 

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 

31 

32 

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) 

37 

38 # Define command line arguments 

39 parser = parser_function() 

40 check_for_initialise() 

41 

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 

46 

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 ) 

63 

64 print(f"Start adding all instances in directory {instances_source} ...") 

65 new_instance_set = Instance_Set(instances_source) 

66 

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) 

79 

80 jobs_help.check_running_waiting_jobs( 

81 gv.settings().DEFAULT_log_output, 

82 ) 

83 

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() 

96 

97 print(f"Adding instance set {new_instance_set.name} done!") 

98 

99 # Write used settings to file 

100 gv.settings().write_used_settings() 

101 sys.exit(0) 

102 

103 

104if __name__ == "__main__": 

105 main(sys.argv[1:])