Skip to content

Commit c1c4b5a

Browse files
h-g-sCopilot
andcommitted
Fix Windows DLL loading: use add_dll_directory and guard cbclib aliases
- Use os.add_dll_directory() instead of PATH manipulation on Windows (Python 3.8+ ignores PATH for DLL dependency resolution) - Wrap Osi_*/Cbc_*/OsiCuts_* module-level aliases in 'if has_cbc:' to avoid NameError when library loading fails Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 055e01f commit c1c4b5a

1 file changed

Lines changed: 36 additions & 30 deletions

File tree

mip/cbc.py

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@
6161
libfile = os.environ["PMIP_CBC_LIBRARY"]
6262
pathlib = dirname(libfile)
6363
if platform.lower().startswith("win"):
64-
if pathlib not in os.environ["PATH"]:
64+
if hasattr(os, "add_dll_directory"):
65+
os.add_dll_directory(pathlib)
66+
elif pathlib not in os.environ["PATH"]:
6567
os.environ["PATH"] += ";" + pathlib
6668
old_dir = os.getcwd()
6769
os.chdir(pathlib)
@@ -81,7 +83,10 @@
8183
# autotools/MinGW places DLLs under bin/, not lib/
8284
_bin_dir = os.path.join(_cbcbox.cbc_dist_dir(), "bin")
8385
libfile = os.path.join(_bin_dir, "libCbc.dll")
84-
if _bin_dir not in os.environ.get("PATH", ""):
86+
# Python 3.8+ ignores PATH for DLL resolution; use add_dll_directory
87+
if hasattr(os, "add_dll_directory"):
88+
os.add_dll_directory(_bin_dir)
89+
elif _bin_dir not in os.environ.get("PATH", ""):
8590
os.environ["PATH"] = _bin_dir + ";" + os.environ["PATH"]
8691
elif platform.lower().startswith("darwin") or platform.lower().startswith(
8792
"macos"
@@ -585,34 +590,35 @@
585590
INT_PARAM_MAX_NODES_NOT_IMPROV_FS = 19
586591

587592

588-
Osi_getNumCols = cbclib.Osi_getNumCols
589-
Osi_getColSolution = cbclib.Osi_getColSolution
590-
Osi_getIntegerTolerance = cbclib.Osi_getIntegerTolerance
591-
Osi_isInteger = cbclib.Osi_isInteger
592-
Osi_isProvenOptimal = cbclib.Osi_isProvenOptimal
593-
Cbc_setIntParam = cbclib.Cbc_setIntParam
594-
Cbc_setDblParam = cbclib.Cbc_setDblParam
595-
Cbc_getSolverPtr = cbclib.Cbc_getSolverPtr
596-
597-
Cbc_generateCuts = cbclib.Cbc_generateCuts
598-
Cbc_solveLinearProgram = cbclib.Cbc_solveLinearProgram
599-
600-
Cbc_reset = cbclib.Cbc_reset
601-
602-
Cbc_computeFeatures = cbclib.Cbc_computeFeatures
603-
Cbc_nFeatures = cbclib.Cbc_nFeatures
604-
Cbc_featureName = cbclib.Cbc_featureName
605-
606-
OsiCuts_new = cbclib.OsiCuts_new
607-
OsiCuts_addRowCut = cbclib.OsiCuts_addRowCut
608-
OsiCuts_addGlobalRowCut = cbclib.OsiCuts_addGlobalRowCut
609-
OsiCuts_sizeRowCuts = cbclib.OsiCuts_sizeRowCuts
610-
OsiCuts_nzRowCut = cbclib.OsiCuts_nzRowCut
611-
OsiCuts_idxRowCut = cbclib.OsiCuts_idxRowCut
612-
OsiCuts_coefRowCut = cbclib.OsiCuts_coefRowCut
613-
OsiCuts_rhsRowCut = cbclib.OsiCuts_rhsRowCut
614-
OsiCuts_senseRowCut = cbclib.OsiCuts_senseRowCut
615-
OsiCuts_delete = cbclib.OsiCuts_delete
593+
if has_cbc:
594+
Osi_getNumCols = cbclib.Osi_getNumCols
595+
Osi_getColSolution = cbclib.Osi_getColSolution
596+
Osi_getIntegerTolerance = cbclib.Osi_getIntegerTolerance
597+
Osi_isInteger = cbclib.Osi_isInteger
598+
Osi_isProvenOptimal = cbclib.Osi_isProvenOptimal
599+
Cbc_setIntParam = cbclib.Cbc_setIntParam
600+
Cbc_setDblParam = cbclib.Cbc_setDblParam
601+
Cbc_getSolverPtr = cbclib.Cbc_getSolverPtr
602+
603+
Cbc_generateCuts = cbclib.Cbc_generateCuts
604+
Cbc_solveLinearProgram = cbclib.Cbc_solveLinearProgram
605+
606+
Cbc_reset = cbclib.Cbc_reset
607+
608+
Cbc_computeFeatures = cbclib.Cbc_computeFeatures
609+
Cbc_nFeatures = cbclib.Cbc_nFeatures
610+
Cbc_featureName = cbclib.Cbc_featureName
611+
612+
OsiCuts_new = cbclib.OsiCuts_new
613+
OsiCuts_addRowCut = cbclib.OsiCuts_addRowCut
614+
OsiCuts_addGlobalRowCut = cbclib.OsiCuts_addGlobalRowCut
615+
OsiCuts_sizeRowCuts = cbclib.OsiCuts_sizeRowCuts
616+
OsiCuts_nzRowCut = cbclib.OsiCuts_nzRowCut
617+
OsiCuts_idxRowCut = cbclib.OsiCuts_idxRowCut
618+
OsiCuts_coefRowCut = cbclib.OsiCuts_coefRowCut
619+
OsiCuts_rhsRowCut = cbclib.OsiCuts_rhsRowCut
620+
OsiCuts_senseRowCut = cbclib.OsiCuts_senseRowCut
621+
OsiCuts_delete = cbclib.OsiCuts_delete
616622

617623

618624
def cbc_set_parameter(model: Solver, param: str, value: str):

0 commit comments

Comments
 (0)