1212from pathlib import Path
1313
1414from qq_lib .batch .interface import BatchInterface
15- from qq_lib .batch .pbs .array_spec import PBSArraySpec
1615from qq_lib .batch .pbs .common import parse_multi_pbs_dump_to_dictionaries
1716from qq_lib .batch .pbs .node import PBSNode
1817from qq_lib .batch .pbs .queue import PBSQueue
18+ from qq_lib .core .array_spec import ArraySpec
1919from qq_lib .core .common import equals_normalized
2020from qq_lib .core .config import CFG
2121from qq_lib .core .error import QQError
2929logger = get_logger (__name__ )
3030
3131
32- class PBS (BatchInterface [PBSJob , PBSQueue , PBSNode , PBSArraySpec ]):
32+ class PBS (BatchInterface [PBSJob , PBSQueue , PBSNode ]):
3333 """
3434 Implementation of BatchInterface for PBS Pro batch system.
3535 """
@@ -76,7 +76,7 @@ def job_submit(
7676 depend : list [Depend ],
7777 env_vars : dict [str , str ],
7878 account : str | None = None ,
79- array : PBSArraySpec | None = None ,
79+ array : ArraySpec | None = None ,
8080 server : str | None = None ,
8181 remote_host : str | None = None ,
8282 ) -> str :
@@ -589,7 +589,7 @@ def _translate_submit(
589589 job_name : str ,
590590 depend : list [Depend ],
591591 env_vars : dict [str , str ],
592- array : PBSArraySpec | None ,
592+ array : ArraySpec | None ,
593593 ) -> str :
594594 """
595595 Generate the PBS submission command for a job.
@@ -603,7 +603,7 @@ def _translate_submit(
603603 job_name (str): Name of the job.
604604 depend (list[Depend]): List of dependencies of the job.
605605 env_vars (dict[str, str]): Dictionary of environment variables to set.
606- array (PBSArraySpec | None): Optional array job specification.
606+ array (ArraySpec | None): Optional array job specification.
607607
608608 Returns:
609609 str: The fully constructed qsub command string.
@@ -612,7 +612,7 @@ def _translate_submit(
612612
613613 # translate array specification
614614 if array :
615- command += f"-J { array . translate ( )} "
615+ command += f"-J { cls . _translate_array ( array )} "
616616
617617 # translate environment variables
618618 if env_vars :
@@ -865,6 +865,28 @@ def _translate_dependencies(cls, depend: list[Depend]) -> str | None:
865865
866866 return "," .join (Depend .to_str (x ).replace ("=" , ":" ) for x in depend )
867867
868+ @classmethod
869+ def _translate_array (cls , array : ArraySpec ) -> str :
870+ """
871+ Translate an `ArraySpec` object into a PBS-compatible array job specification string.
872+
873+ Args:
874+ array (ArraySpec): The array job specification to translate.
875+
876+ Returns:
877+ str: The translated PBS array job specification string.
878+ """
879+ parts : list [str ] = []
880+ for elem in array .elements :
881+ match elem :
882+ case int (index ):
883+ parts .append (str (index ))
884+ case (int (start ), int (stop )):
885+ parts .append (f"{ start } -{ stop } " )
886+ case (int (start ), int (stop ), int (step )):
887+ parts .append (f"{ start } -{ stop } :{ step } " )
888+ return "," .join (parts )
889+
868890 @classmethod
869891 def _collect_ams_env_vars (cls ) -> dict [str , str ]:
870892 """
0 commit comments