1717from collections import namedtuple
1818from collections .abc import Callable , Generator
1919from pathlib import Path
20- from typing import TYPE_CHECKING , Any
20+ from typing import TYPE_CHECKING , Any , Generic , TypeVar
2121
2222import numpy as np
2323import pandas as pd
3636
3737 from linopy .model import Model
3838
39+ EnvType = TypeVar ("EnvType" )
40+
3941QUADRATIC_SOLVERS = [
4042 "gurobi" ,
4143 "xpress" ,
@@ -197,7 +199,7 @@ def maybe_adjust_objective_sign(
197199 return solution
198200
199201
200- class Solver (ABC ):
202+ class Solver (ABC , Generic [ EnvType ] ):
201203 """
202204 Abstract base class for solving a given linear problem.
203205
@@ -244,7 +246,7 @@ def solve_problem_from_model(
244246 log_fn : Path | None = None ,
245247 warmstart_fn : Path | None = None ,
246248 basis_fn : Path | None = None ,
247- env : None = None ,
249+ env : EnvType | None = None ,
248250 explicit_coordinate_names : bool = False ,
249251 ) -> Result :
250252 """
@@ -264,7 +266,7 @@ def solve_problem_from_file(
264266 log_fn : Path | None = None ,
265267 warmstart_fn : Path | None = None ,
266268 basis_fn : Path | None = None ,
267- env : None = None ,
269+ env : EnvType | None = None ,
268270 ) -> Result :
269271 """
270272 Abstract method to solve a linear problem from a problem file.
@@ -283,7 +285,7 @@ def solve_problem(
283285 log_fn : Path | None = None ,
284286 warmstart_fn : Path | None = None ,
285287 basis_fn : Path | None = None ,
286- env : None = None ,
288+ env : EnvType | None = None ,
287289 explicit_coordinate_names : bool = False ,
288290 ) -> Result :
289291 """
@@ -324,7 +326,7 @@ def solver_name(self) -> SolverName:
324326 return SolverName [self .__class__ .__name__ ]
325327
326328
327- class CBC (Solver ):
329+ class CBC (Solver [ None ] ):
328330 """
329331 Solver subclass for the CBC solver.
330332
@@ -505,7 +507,7 @@ def get_solver_solution() -> Solution:
505507 return Result (status , solution , CbcModel (mip_gap , runtime ))
506508
507509
508- class GLPK (Solver ):
510+ class GLPK (Solver [ None ] ):
509511 """
510512 Solver subclass for the GLPK solver.
511513
@@ -675,7 +677,7 @@ def get_solver_solution() -> Solution:
675677 return Result (status , solution )
676678
677679
678- class Highs (Solver ):
680+ class Highs (Solver [ None ] ):
679681 """
680682 Solver subclass for the Highs solver. Highs must be installed
681683 for usage. Find the documentation at https://www.maths.ed.ac.uk/hall/HiGHS/.
@@ -921,7 +923,7 @@ def get_solver_solution() -> Solution:
921923 return Result (status , solution , h )
922924
923925
924- class Gurobi (Solver ):
926+ class Gurobi (Solver [ gurobipy . Env | dict [ str , Any ] | None ] ):
925927 """
926928 Solver subclass for the gurobi solver.
927929
@@ -1156,7 +1158,7 @@ def get_solver_solution() -> Solution:
11561158 return Result (status , solution , m )
11571159
11581160
1159- class Cplex (Solver ):
1161+ class Cplex (Solver [ None ] ):
11601162 """
11611163 Solver subclass for the Cplex solver.
11621164
@@ -1312,7 +1314,7 @@ def get_solver_solution() -> Solution:
13121314 return Result (status , solution , m )
13131315
13141316
1315- class SCIP (Solver ):
1317+ class SCIP (Solver [ None ] ):
13161318 """
13171319 Solver subclass for the SCIP solver.
13181320
@@ -1465,7 +1467,7 @@ def get_solver_solution() -> Solution:
14651467 return Result (status , solution , m )
14661468
14671469
1468- class Xpress (Solver ):
1470+ class Xpress (Solver [ None ] ):
14691471 """
14701472 Solver subclass for the xpress solver.
14711473
@@ -1602,7 +1604,7 @@ def get_solver_solution() -> Solution:
16021604mosek_bas_re = re .compile (r" (XL|XU)\s+([^ \t]+)\s+([^ \t]+)| (LL|UL|BS)\s+([^ \t]+)" )
16031605
16041606
1605- class Mosek (Solver ):
1607+ class Mosek (Solver [ None ] ):
16061608 """
16071609 Solver subclass for the Mosek solver.
16081610
@@ -1932,7 +1934,7 @@ def get_solver_solution() -> Solution:
19321934 return Result (status , solution )
19331935
19341936
1935- class COPT (Solver ):
1937+ class COPT (Solver [ None ] ):
19361938 """
19371939 Solver subclass for the COPT solver.
19381940
@@ -2073,7 +2075,7 @@ def get_solver_solution() -> Solution:
20732075 return Result (status , solution , m )
20742076
20752077
2076- class MindOpt (Solver ):
2078+ class MindOpt (Solver [ None ] ):
20772079 """
20782080 Solver subclass for the MindOpt solver.
20792081
@@ -2216,7 +2218,7 @@ def get_solver_solution() -> Solution:
22162218 return Result (status , solution , m )
22172219
22182220
2219- class PIPS (Solver ):
2221+ class PIPS (Solver [ None ] ):
22202222 """
22212223 Solver subclass for the PIPS solver.
22222224 """
0 commit comments