Read from stdin when no input file specified
This commit is contained in:
parent
83d9e37db6
commit
37aa0c605b
|
@ -9,6 +9,7 @@ from __future__ import annotations
|
|||
import sys
|
||||
import argparse
|
||||
import math
|
||||
import os
|
||||
import os.path
|
||||
from typing import Optional, TextIO
|
||||
|
||||
|
@ -30,8 +31,9 @@ def read_dimacs_graph(f: TextIO) -> list[tuple[int, int, int|float]]:
|
|||
|
||||
edges: list[tuple[int, int, float]] = []
|
||||
|
||||
for s in f:
|
||||
words = s.strip().split()
|
||||
for line in f:
|
||||
s = line.strip()
|
||||
words = s.split()
|
||||
|
||||
if not words[0]:
|
||||
# Skip empty line.
|
||||
|
@ -45,7 +47,7 @@ def read_dimacs_graph(f: TextIO) -> list[tuple[int, int, int|float]]:
|
|||
# Handle "problem" line.
|
||||
if len(words) != 4:
|
||||
raise ValueError(
|
||||
f"Expecting DIMACS edge format but got {s.strip()!r}")
|
||||
f"Expecting DIMACS edge format but got {s!r}")
|
||||
if words[1] != "edge":
|
||||
raise ValueError(
|
||||
f"Expecting DIMACS edge format but got {words[1]!r}")
|
||||
|
@ -53,11 +55,13 @@ def read_dimacs_graph(f: TextIO) -> list[tuple[int, int, int|float]]:
|
|||
elif words[0] == "e":
|
||||
# Handle "edge" line.
|
||||
if len(words) != 4:
|
||||
raise ValueError(f"Expecting edge but got {s.strip()!r}")
|
||||
raise ValueError(f"Expecting edge but got {s!r}")
|
||||
x = int(words[1])
|
||||
y = int(words[2])
|
||||
if (x < 1) or (y < 1):
|
||||
raise ValueError(f"Invalid vertex index {s!r}")
|
||||
w = parse_int_or_float(words[3])
|
||||
edges.append((x, y, w))
|
||||
edges.append((x - 1, y - 1, w))
|
||||
|
||||
else:
|
||||
raise ValueError(f"Unknown line type {words[0]!r}")
|
||||
|
@ -89,8 +93,9 @@ def read_dimacs_matching(
|
|||
weight: int|float = 0
|
||||
pairs: list[tuple[int, int]] = []
|
||||
|
||||
for s in f:
|
||||
words = s.strip().split()
|
||||
for line in f:
|
||||
s = line.strip()
|
||||
words = s.split()
|
||||
|
||||
if not words[0]:
|
||||
# Skip empty line.
|
||||
|
@ -104,7 +109,7 @@ def read_dimacs_matching(
|
|||
# Handle "solution" line.
|
||||
if len(words) != 2:
|
||||
raise ValueError(
|
||||
f"Expecting solution line but got {s.strip()}")
|
||||
f"Expecting solution line but got {s!r}")
|
||||
if have_weight:
|
||||
raise ValueError("Duplicate solution line")
|
||||
have_weight = True
|
||||
|
@ -114,10 +119,12 @@ def read_dimacs_matching(
|
|||
# Handle "matching" line.
|
||||
if len(words) != 3:
|
||||
raise ValueError(
|
||||
f"Expecting matched edge but got {s.strip()}")
|
||||
f"Expecting matched edge but got {s!r}")
|
||||
x = int(words[1])
|
||||
y = int(words[2])
|
||||
pairs.append((x, y))
|
||||
if (x < 1) or (y < 1):
|
||||
raise ValueError(f"Invalid vertex index {s!r}")
|
||||
pairs.append((x - 1, y - 1))
|
||||
|
||||
else:
|
||||
raise ValueError(f"Unknown line type {words[0]!r}")
|
||||
|
@ -152,7 +159,7 @@ def write_dimacs_matching(
|
|||
print("s", f"{weight:.12g}", file=f)
|
||||
|
||||
for (x, y) in pairs:
|
||||
print("m", x, y, file=f)
|
||||
print("m", x + 1, y + 1, file=f)
|
||||
|
||||
|
||||
def write_dimacs_matching_file(
|
||||
|
@ -324,9 +331,6 @@ def main() -> int:
|
|||
parser.description = (
|
||||
"Calculate maximum weighted matching of graphs in DIMACS format.")
|
||||
|
||||
parser.add_argument("--stdin",
|
||||
action="store_true",
|
||||
help="read graph from stdin")
|
||||
parser.add_argument("--verify",
|
||||
action="store_true",
|
||||
help="verify existing output file(s)")
|
||||
|
@ -344,24 +348,19 @@ def main() -> int:
|
|||
help="directory to write output")
|
||||
parser.add_argument("input",
|
||||
nargs="*",
|
||||
help="input file(s)")
|
||||
help="input file(s); leave empty to read from stdin")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.stdin and args.verify:
|
||||
print("ERROR: Can not verify when reading from stdin",
|
||||
if (not args.input) and os.isatty(sys.stdin.fileno()):
|
||||
print("ERROR: Expecting input from stdin but stdin is a terminal",
|
||||
file=sys.stderr)
|
||||
return 1
|
||||
|
||||
if (not args.stdin) and (not args.input):
|
||||
parser.print_help(sys.stderr)
|
||||
print(file=sys.stderr)
|
||||
print("ERROR: Specify either --stdin or at least one input file",
|
||||
file=sys.stderr)
|
||||
parser.print_help(sys.stderr)
|
||||
return 1
|
||||
|
||||
if args.stdin and args.input:
|
||||
print("ERROR: Specify either --stdin or input files, not both",
|
||||
if (not args.input) and args.verify:
|
||||
print("ERROR: Can not verify when reading from stdin",
|
||||
file=sys.stderr)
|
||||
return 1
|
||||
|
||||
|
|
Loading…
Reference in New Issue