Given any path belonging to a multi-file model (e.g. foo.bin.1), return the nth path in the model.
(path: Path, n: int)
| 1003 | return out |
| 1004 | |
| 1005 | def nth_multifile_path(path: Path, n: int) -> Path | None: |
| 1006 | '''Given any path belonging to a multi-file model (e.g. foo.bin.1), return |
| 1007 | the nth path in the model. |
| 1008 | ''' |
| 1009 | # Support the following patterns: |
| 1010 | patterns: list[tuple[str, str]] = [ |
| 1011 | # - x.00.pth, x.01.pth, etc. |
| 1012 | (r'\.[0-9]{2}\.pth$', f'.{n:02}.pth'), |
| 1013 | # - x-00001-of-00002.bin, x-00002-of-00002.bin, etc. |
| 1014 | (r'-[0-9]{5}-of-(.*)$', fr'-{n:05}-of-\1'), |
| 1015 | # x.bin, x.bin.1, etc. |
| 1016 | (r'(\.[0-9]+)?$', r'\1' if n == 0 else fr'\1.{n}') |
| 1017 | ] |
| 1018 | for regex, replacement in patterns: |
| 1019 | if re.search(regex, path.name): |
| 1020 | new_path = path.with_name(re.sub(regex, replacement, path.name)) |
| 1021 | if new_path.exists(): |
| 1022 | return new_path |
| 1023 | return None |
| 1024 | |
| 1025 | |
| 1026 | def find_multifile_paths(path: Path) -> list[Path]: |
no test coverage detected