Skip to content

Commit 61bf06f

Browse files
committed
cuopt service resolve conflict with log_file parameter and callbacks
1 parent edaeef7 commit 61bf06f

File tree

5 files changed

+21
-23
lines changed

5 files changed

+21
-23
lines changed

python/cuopt/cuopt/linear_programming/solver/solver.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020

2121
@catch_cuopt_exception
22-
def Solve(data_model, solver_settings=None, log_file=""):
22+
def Solve(data_model, solver_settings=None):
2323
"""
2424
Solve the Linear Program passed as input and returns the solution.
2525
@@ -92,13 +92,12 @@ def is_mip(var_types):
9292
return solver_wrapper.Solve(
9393
data_model,
9494
solver_settings,
95-
log_file,
9695
mip=is_mip(data_model.get_variable_types()),
9796
)
9897

9998

10099
@catch_cuopt_exception
101-
def BatchSolve(data_model_list, solver_settings=None, log_file=""):
100+
def BatchSolve(data_model_list, solver_settings=None):
102101
"""
103102
Solve the list of Linear Programs passed as input and returns the solutions
104103
and total solve time.
@@ -174,6 +173,4 @@ def BatchSolve(data_model_list, solver_settings=None, log_file=""):
174173
if solver_settings is None:
175174
solver_settings = SolverSettings()
176175

177-
return solver_wrapper.BatchSolve(
178-
data_model_list, solver_settings, log_file
179-
)
176+
return solver_wrapper.BatchSolve(data_model_list, solver_settings)

python/cuopt/cuopt/linear_programming/solver/solver_wrapper.pyx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ from numba import cuda
6565
import cudf
6666
from cudf.core.buffer import as_buffer
6767

68-
from cuopt.linear_programming.solver.solver_parameters import CUOPT_LOG_FILE
6968
from cuopt.linear_programming.solver_settings.solver_settings import (
7069
PDLPSolverMode,
7170
SolverSettings,
@@ -279,7 +278,6 @@ cdef set_data_model_view(DataModel data_model_obj):
279278
cdef set_solver_setting(
280279
unique_ptr[solver_settings_t[int, double]]& unique_solver_settings,
281280
settings,
282-
log_file,
283281
DataModel data_model_obj=None,
284282
mip=False):
285283
cdef solver_settings_t[int, double]* c_solver_settings = (
@@ -425,13 +423,6 @@ cdef set_solver_setting(
425423
settings.get_pdlp_warm_start_data().iterations_since_last_restart # noqa
426424
)
427425

428-
# Common to LP and MIP
429-
430-
c_solver_settings.set_parameter_from_string(
431-
CUOPT_LOG_FILE.encode('utf-8'),
432-
log_file.encode('utf-8')
433-
)
434-
435426
cdef create_solution(unique_ptr[solver_ret_t] sol_ret_ptr,
436427
DataModel data_model_obj,
437428
is_batch=False):
@@ -670,7 +661,7 @@ cdef create_solution(unique_ptr[solver_ret_t] sol_ret_ptr,
670661
)
671662

672663

673-
def Solve(py_data_model_obj, settings, str log_file, mip=False):
664+
def Solve(py_data_model_obj, settings, mip=False):
674665

675666
cdef DataModel data_model_obj = <DataModel>py_data_model_obj
676667
cdef unique_ptr[solver_settings_t[int, double]] unique_solver_settings
@@ -682,7 +673,7 @@ def Solve(py_data_model_obj, settings, str log_file, mip=False):
682673
)
683674

684675
set_solver_setting(
685-
unique_solver_settings, settings, log_file, data_model_obj, mip
676+
unique_solver_settings, settings, data_model_obj, mip
686677
)
687678
set_data_model_view(data_model_obj)
688679

@@ -697,13 +688,13 @@ cdef insert_vector(DataModel data_model_obj,
697688
data_model_views.push_back(data_model_obj.c_data_model_view.get())
698689

699690

700-
def BatchSolve(py_data_model_list, settings, str log_file):
691+
def BatchSolve(py_data_model_list, settings):
701692
cdef unique_ptr[solver_settings_t[int, double]] unique_solver_settings
702693
unique_solver_settings.reset(new solver_settings_t[int, double]())
703694

704695
if settings.get_pdlp_warm_start_data() is not None: # noqa
705696
raise Exception("Cannot use warmstart data with Batch Solve")
706-
set_solver_setting(unique_solver_settings, settings, log_file)
697+
set_solver_setting(unique_solver_settings, settings)
707698

708699
cdef vector[data_model_view_t[int, double] *] data_model_views
709700

python/cuopt_server/cuopt_server/utils/linear_programming/solver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ def get_solver_exception_type(status, message):
415415
return RuntimeError(msg)
416416

417417

418-
def solve(LP_data, reqId, intermediate_sender, warmstart_data, log_file):
418+
def solve(LP_data, reqId, intermediate_sender, warmstart_data):
419419
notes = []
420420

421421
def get_if_attribute_is_valid_else_none(attr):
@@ -546,7 +546,7 @@ def create_solution(sol):
546546
solver_settings.set_mip_callback(callback)
547547
solve_begin_time = time.time()
548548
sol = linear_programming.Solve(
549-
data_model, solver_settings=solver_settings, log_file=log_file
549+
data_model, solver_settings=solver_settings
550550
)
551551
total_solve_time = time.time() - solve_begin_time
552552

python/cuopt_server/cuopt_server/utils/solver.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,18 @@ def solve_LP_sync(
103103
log_fname = "log_" + reqId
104104
log_file = os.path.join(log_dir, log_fname)
105105
logging.info(f"Writing logs to {log_file}")
106+
# We have to potentially overwrite the user log_file
107+
# value here since we are running in the service and using
108+
# web callbacks. The user can not use callbacks if they
109+
# want explicit control over the log file.
110+
LP_data.solver_config.log_file = log_file
106111
else:
107112
log_file = ""
108113
notes, addl_warnings, res, total_solve_time = LP_solve(
109-
LP_data, reqId, intermediate_sender, warmstart_data, log_file
114+
LP_data,
115+
reqId,
116+
intermediate_sender,
117+
warmstart_data,
110118
)
111119
warnings.extend(addl_warnings)
112120
else:

python/cuopt_server/cuopt_server/webserver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,9 @@ async def postrequest(
957957
),
958958
solver_logs: Optional[bool] = Query(
959959
default=False,
960-
description="If set to True, MIP problems will produce detailed solver logs that can be retrieved from /cuopt/log/{id}", # noqa
960+
description="If set to True, MIP problems will produce detailed solver logs that can be retrieved from /cuopt/log/{id}. " # noqa
961+
"The solver_config.log_file value will be set to log_{id} overriding any user value set. If a user wants logs generated " # noqa
962+
"on the server with a user-defined name, then do not use the callback mechanism and simply set solver_config.log_file as desired.", # noqa
961963
),
962964
cuopt_data_file: str = Header(
963965
default=None,

0 commit comments

Comments
 (0)