diff --git a/API/Classes/Base/Config.py b/API/Classes/Base/Config.py index bbbe41ab..ca30abf4 100644 --- a/API/Classes/Base/Config.py +++ b/API/Classes/Base/Config.py @@ -1,5 +1,6 @@ from pathlib import Path import os +import shutil #from dotenv import load_dotenv import platform @@ -27,6 +28,26 @@ EXTRACT_FOLDER = Path("") SOLVERs_FOLDER = Path('WebAPP', 'SOLVERs') +# --- Solver path resolution --- +# Priority: 1) env var override 2) OS-specific default +_glpk_env = os.environ.get("MUIO_GLPK_PATH") +_cbc_env = os.environ.get("MUIO_CBC_PATH") + +if _glpk_env: + GLPK_PATH = Path(_glpk_env) +elif SYSTEM == "Windows": + GLPK_PATH = Path(SOLVERs_FOLDER, 'GLPK') +else: + _glpk_bin = shutil.which("glpsol") + GLPK_PATH = Path(_glpk_bin).parent if _glpk_bin else None + +if _cbc_env: + CBC_PATH = Path(_cbc_env) +elif SYSTEM == "Windows": + CBC_PATH = Path(SOLVERs_FOLDER, 'COIN-OR') +else: + _cbc_bin = shutil.which("cbc") + CBC_PATH = Path(_cbc_bin).parent if _cbc_bin else None #absolute paths # OSEMOSYS_ROOT = os.path.abspath(os.getcwd()) diff --git a/API/Classes/Case/OsemosysClass.py b/API/Classes/Case/OsemosysClass.py index 7ec40e0f..db43cddb 100644 --- a/API/Classes/Case/OsemosysClass.py +++ b/API/Classes/Case/OsemosysClass.py @@ -1,5 +1,4 @@ from pathlib import Path -import platform from Classes.Base import Config from Classes.Base.FileClass import File @@ -45,20 +44,17 @@ def __init__(self, case): self.osemosysFile = Path(Config.SOLVERs_FOLDER,'model.v.5.4.txt') self.osemosysFileOriginal = Path(Config.SOLVERs_FOLDER,'osemosys.txt') - if platform.system() == 'Windows': - #self.glpkFolder = Path(Config.SOLVERs_FOLDER, 'GLPK','glpk-4.65', 'w64') - # self.cbcFolder = Path(Config.SOLVERs_FOLDER,'COIN-OR', 'Cbc-2.7.5-win64-intel11.1', 'bin') - self.glpkFolder = Path(Config.SOLVERs_FOLDER, 'GLPK') - self.cbcFolder = Path(Config.SOLVERs_FOLDER,'COIN-OR') - - #self.cbcFolder = Path(Config.SOLVERs_FOLDER,'COIN-OR', 'Cbc-2.10-win64-msvc16-md', 'bin') - - #Cbc-master-win64-msvc16-mt - #self.cbcFolder = Path(Config.SOLVERs_FOLDER,'COIN-OR', 'Cbc-master-win64-msvc16-md', 'bin') - - else: - self.glpkFolder = Path(Config.SOLVERs_FOLDER, 'GLPK','glpk-4.65', 'w64') - self.cbcFolder = Path(Config.SOLVERs_FOLDER,'COIN-OR', 'Cbc-2.10-osx10.15-x86_64-gcc9', 'bin') + self.glpkFolder = Config.GLPK_PATH + self.cbcFolder = Config.CBC_PATH + + if not self.glpkFolder: + raise RuntimeError( + "GLPK solver not found. Install glpk or set MUIO_GLPK_PATH." + ) + if not self.cbcFolder: + raise RuntimeError( + "CBC solver not found. Install cbc or set MUIO_CBC_PATH." + ) self.resultsPath = Path(Config.DATA_STORAGE,case,'res') self.viewFolderPath = Path(Config.DATA_STORAGE,case,'view') diff --git a/requirements.txt b/requirements.txt index f1a065dd..31bf88b0 100644 Binary files a/requirements.txt and b/requirements.txt differ