@@ -31,3 +31,38 @@ cuopt_cli "${RAPIDS_DATASET_ROOT_DIR}"/linear_programming/good-mps-1.lp.bz2 | gr
3131# Add a for mixed integer programming test with options
3232
3333cuopt_cli " ${RAPIDS_DATASET_ROOT_DIR} " /mip/sample.mps --mip-absolute-gap 0.01 --time-limit 10 | grep -q " Solution objective" || (echo " Expected solution objective not found" && exit 1)
34+
35+ # Regression for opportunistic concurrent root LP solve on an infeasible MILP.
36+ # Default opportunistic mode should return Infeasible instead of aborting.
37+ tmp_mps=" $( mktemp " ${TMPDIR:-/ tmp} /cuopt-infeasible-milp.XXXXXX.mps" ) "
38+ trap ' rm -f "${tmp_mps}"' EXIT
39+ python3 - " ${tmp_mps} " << 'PY '
40+ import sys
41+
42+ path = sys.argv[1]
43+ n = 120
44+ a_vals = [1.0 + ((i * 37) % 90) / 10.0 for i in range(n)]
45+ b_vals = [a + (((i * 17) % 11) - 5.0) / 20.0 for i, a in enumerate(a_vals)]
46+ need_a = 0.8 * sum(a_vals)
47+ cap_b = 0.3 * sum(b_vals)
48+
49+ with open(path, "w", encoding="utf-8") as f:
50+ f.write("NAME INFEAS_MILP\n")
51+ f.write("ROWS\n")
52+ f.write(" N COST\n")
53+ f.write(" G NEED_A\n")
54+ f.write(" L CAP_B\n")
55+ f.write("COLUMNS\n")
56+ f.write(" M1 'MARKER' 'INTORG'\n")
57+ for i, (a, b) in enumerate(zip(a_vals, b_vals)):
58+ f.write(f" x{i:<8} COST 1 NEED_A {a:.17g}\n")
59+ f.write(f" x{i:<8} CAP_B {b:.17g}\n")
60+ f.write(" M2 'MARKER' 'INTEND'\n")
61+ f.write("RHS\n")
62+ f.write(f" RHS NEED_A {need_a:.17g} CAP_B {cap_b:.17g}\n")
63+ f.write("BOUNDS\n")
64+ for i in range(n):
65+ f.write(f" UP BND x{i:<8} 1\n")
66+ f.write("ENDATA\n")
67+ PY
68+ cuopt_cli " ${tmp_mps} " --time-limit 30 | grep -q " Infeasible" || (echo " Expected infeasible status for opportunistic MILP" && exit 1)
0 commit comments