Skip to content

Commit b9bfccf

Browse files
committed
Add optional timestamps enabled by env CUOPT_EXTRA_TIMESTAMPS
1 parent 167192b commit b9bfccf

File tree

4 files changed

+61
-3
lines changed

4 files changed

+61
-3
lines changed

cpp/src/linear_programming/cuopt_c.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
#include <cuopt/version_config.hpp>
2828

2929
#include <memory>
30+
#include <cstdlib>
3031
#include <string>
3132

33+
3234
using namespace cuopt::mps_parser;
3335
using namespace cuopt::linear_programming;
3436

@@ -74,6 +76,29 @@ cuopt_int_t cuOptGetVersion(cuopt_int_t* version_major,
7476
return CUOPT_SUCCESS;
7577
}
7678

79+
bool extraTimestamps() {
80+
const char* envValue = std::getenv("CUOPT_EXTRA_TIMESTAMPS");
81+
if (envValue == nullptr) {
82+
return false;
83+
}
84+
85+
std::string value(envValue);
86+
return (value == "True" || value == "true" || value == "1");
87+
}
88+
89+
90+
double getCurrentTimestamp() {
91+
auto now = std::chrono::system_clock::now();
92+
return std::chrono::duration<double>(now.time_since_epoch()).count();
93+
}
94+
95+
void printTimestamp(const std::string& label) {
96+
if (extraTimestamps()) {
97+
std::cout << std::fixed << std::setprecision(6);
98+
std::cout << std::endl << label << ": " << getCurrentTimestamp() << std::endl;
99+
}
100+
}
101+
77102
cuopt_int_t cuOptReadProblem(const char* filename, cuOptOptimizationProblem* problem_ptr)
78103
{
79104
problem_and_stream_view_t* problem_and_stream = new problem_and_stream_view_t();
@@ -115,6 +140,9 @@ cuopt_int_t cuOptCreateProblem(cuopt_int_t num_constraints,
115140
const char* variable_types,
116141
cuOptOptimizationProblem* problem_ptr)
117142
{
143+
144+
printTimestamp("CUOPT_CREATE_PROBLEM");
145+
118146
if (problem_ptr == nullptr || objective_coefficients == nullptr ||
119147
constraint_matrix_row_offsets == nullptr || constraint_matrix_column_indices == nullptr ||
120148
constraint_matrix_coefficent_values == nullptr || constraint_sense == nullptr ||
@@ -170,6 +198,9 @@ cuopt_int_t cuOptCreateRangedProblem(cuopt_int_t num_constraints,
170198
const char* variable_types,
171199
cuOptOptimizationProblem* problem_ptr)
172200
{
201+
202+
printTimestamp("CUOPT_CREATE_PROBLEM");
203+
173204
if (problem_ptr == nullptr || objective_coefficients == nullptr ||
174205
constraint_matrix_row_offsets == nullptr || constraint_matrix_column_indices == nullptr ||
175206
constraint_matrix_coefficent_values == nullptr || constraint_lower_bounds == nullptr ||
@@ -596,6 +627,8 @@ cuopt_int_t cuOptSolve(cuOptOptimizationProblem problem,
596627
cuOptSolverSettings settings,
597628
cuOptSolution* solution_ptr)
598629
{
630+
printTimestamp("CUOPT_SOLVE_START");
631+
599632
if (problem == nullptr) { return CUOPT_INVALID_ARGUMENT; }
600633
if (settings == nullptr) { return CUOPT_INVALID_ARGUMENT; }
601634
if (solution_ptr == nullptr) { return CUOPT_INVALID_ARGUMENT; }
@@ -614,6 +647,9 @@ cuopt_int_t cuOptSolve(cuOptOptimizationProblem problem,
614647
solution_and_stream_view->mip_solution_ptr = new mip_solution_t<cuopt_int_t, cuopt_float_t>(
615648
solve_mip<cuopt_int_t, cuopt_float_t>(*op_problem, mip_settings));
616649
*solution_ptr = static_cast<cuOptSolution>(solution_and_stream_view);
650+
651+
printTimestamp("CUOPT_SOLVE_RETURN");
652+
617653
return static_cast<cuopt_int_t>(
618654
solution_and_stream_view->mip_solution_ptr->get_error_status().get_error_type());
619655
} else {
@@ -629,6 +665,9 @@ cuopt_int_t cuOptSolve(cuOptOptimizationProblem problem,
629665
new optimization_problem_solution_t<cuopt_int_t, cuopt_float_t>(
630666
solve_lp<cuopt_int_t, cuopt_float_t>(*op_problem, pdlp_settings));
631667
*solution_ptr = static_cast<cuOptSolution>(solution_and_stream_view);
668+
669+
printTimestamp("CUOPT_SOLVE_RETURN");
670+
632671
return static_cast<cuopt_int_t>(
633672
solution_and_stream_view->lp_solution_ptr->get_error_status().get_error_type());
634673
}

python/cuopt/cuopt/linear_programming/data_model/data_model.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
import time
17+
import os
18+
1619
from . import data_model_wrapper
1720
from .utilities import catch_cuopt_exception
1821

@@ -151,6 +154,8 @@ class DataModel(data_model_wrapper.DataModel):
151154
"""
152155

153156
def __init__(self):
157+
if os.environ.get("CUOPT_EXTRA_TIMESTAMPS", False) in (True, "True", "true"):
158+
print(f"CUOPT_CREATE_PROBLEM: {time.time()}")
154159
super().__init__()
155160

156161
@catch_cuopt_exception

python/cuopt/cuopt/linear_programming/problem.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# limitations under the License.
1515

1616
from enum import Enum
17-
17+
import time
1818
import numpy as np
1919

2020
import cuopt.linear_programming.data_model as data_model
@@ -950,6 +950,10 @@ def solve(self, settings=solver_settings.SolverSettings()):
950950
>>> problem.solve()
951951
"""
952952

953+
# Move optional timing marker to the beginning of the
954+
# routine
955+
dm = data_model.DataModel()
956+
953957
# iterate through the constraints and construct the constraint matrix
954958
n = len(self.vars)
955959
self.row_pointers = [0]
@@ -975,7 +979,6 @@ def solve(self, settings=solver_settings.SolverSettings()):
975979
self.upper_bound[j] = self.vars[j].getUpperBound()
976980

977981
# Initialize datamodel
978-
dm = data_model.DataModel()
979982
dm.set_csr_constraint_matrix(
980983
np.array(self.values),
981984
np.array(self.column_indicies),

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
import time
17+
import os
18+
1619
from cuopt.linear_programming.solver import solver_wrapper
1720
from cuopt.linear_programming.solver_settings import SolverSettings
1821
from cuopt.utilities import catch_cuopt_exception
@@ -78,6 +81,11 @@ def Solve(data_model, solver_settings=None):
7881
>>> # Print the value of one specific variable
7982
>>> print(solution.get_vars()["var_name"])
8083
"""
84+
85+
emit_stamps = os.environ.get("CUOPT_EXTRA_TIMESTAMPS", False) in (True, "True", "true")
86+
if emit_stamps:
87+
print(f"CUOPT_SOLVE_START: {time.time()}")
88+
8189
if solver_settings is None:
8290
solver_settings = SolverSettings()
8391

@@ -95,11 +103,14 @@ def is_mip(var_types):
95103
# Mixed types - fallback to comprehensive check
96104
return any(vt == "I" or vt == b"I" for vt in var_types)
97105

98-
return solver_wrapper.Solve(
106+
s = solver_wrapper.Solve(
99107
data_model,
100108
solver_settings,
101109
mip=is_mip(data_model.get_variable_types()),
102110
)
111+
if emit_stamps:
112+
print(f"CUOPT_SOLVE_RETURN: {time.time()}")
113+
return s
103114

104115

105116
@catch_cuopt_exception

0 commit comments

Comments
 (0)