import os
import re
import sys
from collections import OrderedDict
from pathlib import Path
from typing import Set, Tuple
CATEGORY_PREFIXES = [
"hyb_lda_xc", "hyb_gga_xc", "hyb_mgga_xc",
"hyb_lda_x", "hyb_gga_x", "hyb_mgga_x",
"hyb_lda_c", "hyb_gga_c", "hyb_mgga_c",
"lda_xc", "lda_x", "lda_c",
"gga_xc", "gga_x", "gga_c",
"mgga_xc", "mgga_x", "mgga_c",
]
SPECIES_LIST = [
"BrOH_cation_restr",
"BrOH_cation",
"BrOH",
"H_restr",
"Li_restr",
"H",
"Li",
]
def parse_skip_list(generate_tests_path: Path) -> Set[str]:
source = generate_tests_path.read_text()
m = re.search(r"skipped_cases\s*=\s*'''(.*?)'''", source, re.DOTALL)
if not m:
return set()
return set(m.group(1).split())
def parse_case(case: str) -> Tuple[str, str, str]:
case = case[5:]
case = "_".join(case.split("_")[:-2])
kind = None
for prefix in CATEGORY_PREFIXES:
if case.startswith(prefix):
kind = prefix
case = case[len(prefix):]
break
if kind is None:
raise ValueError(f"Cannot determine category for: {case}")
species = None
for sp in SPECIES_LIST:
if case.endswith(sp):
species = sp
case = case[: -len(sp)]
break
if species is None:
raise ValueError(f"Cannot determine species for: {case}")
xc_name = case.strip("_")
if not xc_name:
raise ValueError(f"Empty xc_name for case: {case}")
return kind, xc_name, species
def main() -> None:
script_dir = Path(__file__).resolve().parent
default_output = script_dir / "skipped_tests"
if len(sys.argv) > 1:
generate_tests_path = Path(sys.argv[1])
else:
libxc_repo = os.environ.get("LIBXC_REPO_PATH")
if not libxc_repo:
sys.exit("Set LIBXC_REPO_PATH or pass the xc-generate_tests.py path as argument")
generate_tests_path = Path(libxc_repo) / "testsuite/xc-generate_tests.py"
output_path = Path(sys.argv[2]) if len(sys.argv) > 2 else default_output
skip_set = parse_skip_list(generate_tests_path)
print(f"Loaded {len(skip_set)} skip entries from {generate_tests_path}")
data = OrderedDict()
for case in sorted(skip_set):
kind, xc_name, species = parse_case(case)
key = (kind, xc_name, species)
if key not in data:
data[key] = None
lines = [f"{kind}.{xc_name}.{species}" for (kind, xc_name, species) in data.keys()]
output_path.write_text("\n".join(lines) + "\n")
print(f"Wrote {len(lines)} unique (category, xc_name, species) entries to {output_path}")
if __name__ == "__main__":
main()