Skip to content

Commit

Permalink
Resolve ambiguous ADL println() calls (#427)
Browse files Browse the repository at this point in the history
  • Loading branch information
calcmogul authored Mar 2, 2024
1 parent bc1c59b commit 7cc2c82
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 57 deletions.
12 changes: 6 additions & 6 deletions src/autodiff/Variable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ Variable& Variable::SetValue(double value) {
// We only need to check the first argument since unary and binary operators
// both use it
if (expr->args[0] != detail::Zero()) {
println(stderr,
"WARNING: {}:{}: Modified the value of a dependent variable",
__FILE__, __LINE__);
sleipnir::println(
stderr, "WARNING: {}:{}: Modified the value of a dependent variable",
__FILE__, __LINE__);
}
expr->value = value;
}
Expand All @@ -51,9 +51,9 @@ Variable& Variable::SetValue(int value) {
// We only need to check the first argument since unary and binary operators
// both use it
if (expr->args[0] != detail::Zero()) {
println(stderr,
"WARNING: {}:{}: Modified the value of a dependent variable",
__FILE__, __LINE__);
sleipnir::println(
stderr, "WARNING: {}:{}: Modified the value of a dependent variable",
__FILE__, __LINE__);
}
expr->value = value;
}
Expand Down
29 changes: 17 additions & 12 deletions src/optimization/OptimizationProblem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,19 +154,24 @@ SolverStatus OptimizationProblem::Solve(const SolverConfig& config) {
"quadratic", "nonlinear"};

// Print cost function and constraint expression types
println("The cost function is {}.",
kExprTypeToName[static_cast<int>(status.costFunctionType)]);
println("The equality constraints are {}.",
kExprTypeToName[static_cast<int>(status.equalityConstraintType)]);
println("The inequality constraints are {}.",
kExprTypeToName[static_cast<int>(status.inequalityConstraintType)]);
println("");
sleipnir::println(
"The cost function is {}.",
kExprTypeToName[static_cast<int>(status.costFunctionType)]);
sleipnir::println(
"The equality constraints are {}.",
kExprTypeToName[static_cast<int>(status.equalityConstraintType)]);
sleipnir::println(
"The inequality constraints are {}.",
kExprTypeToName[static_cast<int>(status.inequalityConstraintType)]);
sleipnir::println("");

// Print problem dimensionality
println("Number of decision variables: {}", m_decisionVariables.size());
println("Number of equality constraints: {}", m_equalityConstraints.size());
println("Number of inequality constraints: {}\n",
m_inequalityConstraints.size());
sleipnir::println("Number of decision variables: {}",
m_decisionVariables.size());
sleipnir::println("Number of equality constraints: {}",
m_equalityConstraints.size());
sleipnir::println("Number of inequality constraints: {}\n",
m_inequalityConstraints.size());
}

// If the problem is empty or constant, there's nothing to do
Expand All @@ -183,7 +188,7 @@ SolverStatus OptimizationProblem::Solve(const SolverConfig& config) {
x, s, &status);

if (config.diagnostics) {
println("Exit condition: {}", ToMessage(status.exitCondition));
sleipnir::println("Exit condition: {}", ToMessage(status.exitCondition));
}

// Assign the solution to the original Variable instances
Expand Down
85 changes: 46 additions & 39 deletions src/optimization/solver/InteriorPoint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,12 @@ void InteriorPoint(
// Check for overconstrained problem
if (equalityConstraints.size() > decisionVariables.size()) {
if (config.diagnostics) {
println("The problem has too few degrees of freedom.");
println("Violated constraints (cₑ(x) = 0) in order of declaration:");
sleipnir::println("The problem has too few degrees of freedom.");
sleipnir::println(
"Violated constraints (cₑ(x) = 0) in order of declaration:");
for (int row = 0; row < c_e.rows(); ++row) {
if (c_e(row) < 0.0) {
println(" {}/{}: {} = 0", row + 1, c_e.rows(), c_e(row));
sleipnir::println(" {}/{}: {} = 0", row + 1, c_e.rows(), c_e(row));
}
}
}
Expand All @@ -134,7 +135,7 @@ void InteriorPoint(
}

if (config.diagnostics && !feasibilityRestoration) {
println("Error tolerance: {}\n", config.tolerance);
sleipnir::println("Error tolerance: {}\n", config.tolerance);
}

std::chrono::system_clock::time_point iterationsStartTime;
Expand All @@ -146,35 +147,38 @@ void InteriorPoint(
if (config.diagnostics && !feasibilityRestoration) {
auto solveEndTime = std::chrono::system_clock::now();

println("\nSolve time: {:.3f} ms",
ToMilliseconds(solveEndTime - solveStartTime));
println(" ↳ {:.3f} ms (solver setup)",
ToMilliseconds(iterationsStartTime - solveStartTime));
sleipnir::println("\nSolve time: {:.3f} ms",
ToMilliseconds(solveEndTime - solveStartTime));
sleipnir::println(" ↳ {:.3f} ms (solver setup)",
ToMilliseconds(iterationsStartTime - solveStartTime));
if (iterations > 0) {
println(
sleipnir::println(
" ↳ {:.3f} ms ({} solver iterations; {:.3f} ms average)",
ToMilliseconds(solveEndTime - iterationsStartTime), iterations,
ToMilliseconds((solveEndTime - iterationsStartTime) / iterations));
}
println("");
sleipnir::println("");

println("{:^8} {:^10} {:^14} {:^6}", "autodiff", "setup (ms)",
"avg solve (ms)", "solves");
println("{:=^47}", "");
sleipnir::println("{:^8} {:^10} {:^14} {:^6}", "autodiff",
"setup (ms)", "avg solve (ms)", "solves");
sleipnir::println("{:=^47}", "");
constexpr auto format = "{:^8} {:10.3f} {:14.3f} {:6}";
println(format, "∇f(x)", gradientF.GetProfiler().SetupDuration(),
gradientF.GetProfiler().AverageSolveDuration(),
gradientF.GetProfiler().SolveMeasurements());
println(format, "∇²ₓₓL", hessianL.GetProfiler().SetupDuration(),
hessianL.GetProfiler().AverageSolveDuration(),
hessianL.GetProfiler().SolveMeasurements());
println(format, "∂cₑ/∂x", jacobianCe.GetProfiler().SetupDuration(),
jacobianCe.GetProfiler().AverageSolveDuration(),
jacobianCe.GetProfiler().SolveMeasurements());
println(format, "∂cᵢ/∂x", jacobianCi.GetProfiler().SetupDuration(),
jacobianCi.GetProfiler().AverageSolveDuration(),
jacobianCi.GetProfiler().SolveMeasurements());
println("");
sleipnir::println(format, "∇f(x)",
gradientF.GetProfiler().SetupDuration(),
gradientF.GetProfiler().AverageSolveDuration(),
gradientF.GetProfiler().SolveMeasurements());
sleipnir::println(format, "∇²ₓₓL", hessianL.GetProfiler().SetupDuration(),
hessianL.GetProfiler().AverageSolveDuration(),
hessianL.GetProfiler().SolveMeasurements());
sleipnir::println(format, "∂cₑ/∂x",
jacobianCe.GetProfiler().SetupDuration(),
jacobianCe.GetProfiler().AverageSolveDuration(),
jacobianCe.GetProfiler().SolveMeasurements());
sleipnir::println(format, "∂cᵢ/∂x",
jacobianCi.GetProfiler().SetupDuration(),
jacobianCi.GetProfiler().AverageSolveDuration(),
jacobianCi.GetProfiler().SolveMeasurements());
sleipnir::println("");
}
}};

Expand Down Expand Up @@ -244,13 +248,14 @@ void InteriorPoint(
// Check for local equality constraint infeasibility
if (IsEqualityLocallyInfeasible(A_e, c_e)) {
if (config.diagnostics) {
println(
sleipnir::println(
"The problem is locally infeasible due to violated equality "
"constraints.");
println("Violated constraints (cₑ(x) = 0) in order of declaration:");
sleipnir::println(
"Violated constraints (cₑ(x) = 0) in order of declaration:");
for (int row = 0; row < c_e.rows(); ++row) {
if (c_e(row) < 0.0) {
println(" {}/{}: {} = 0", row + 1, c_e.rows(), c_e(row));
sleipnir::println(" {}/{}: {} = 0", row + 1, c_e.rows(), c_e(row));
}
}
}
Expand All @@ -262,13 +267,14 @@ void InteriorPoint(
// Check for local inequality constraint infeasibility
if (IsInequalityLocallyInfeasible(A_i, c_i)) {
if (config.diagnostics) {
println(
sleipnir::println(
"The problem is infeasible due to violated inequality "
"constraints.");
println("Violated constraints (cᵢ(x) ≥ 0) in order of declaration:");
sleipnir::println(
"Violated constraints (cᵢ(x) ≥ 0) in order of declaration:");
for (int row = 0; row < c_i.rows(); ++row) {
if (c_i(row) < 0.0) {
println(" {}/{}: {} ≥ 0", row + 1, c_i.rows(), c_i(row));
sleipnir::println(" {}/{}: {} ≥ 0", row + 1, c_i.rows(), c_i(row));
}
}
}
Expand Down Expand Up @@ -821,15 +827,16 @@ void InteriorPoint(
// Diagnostics for current iteration
if (config.diagnostics) {
if (iterations % 20 == 0) {
println("{:^4} {:^9} {:^13} {:^13} {:^13}", "iter", "time (ms)",
"error", "cost", "infeasibility");
println("{:=^61}", "");
sleipnir::println("{:^4} {:^9} {:^13} {:^13} {:^13}", "iter",
"time (ms)", "error", "cost", "infeasibility");
sleipnir::println("{:=^61}", "");
}

println("{:4}{} {:9.3f} {:13e} {:13e} {:13e}", iterations,
feasibilityRestoration ? "r" : " ",
ToMilliseconds(innerIterEndTime - innerIterStartTime), E_0,
f.Value(), c_e.lpNorm<1>() + (c_i - s).lpNorm<1>());
sleipnir::println("{:4}{} {:9.3f} {:13e} {:13e} {:13e}", iterations,
feasibilityRestoration ? "r" : " ",
ToMilliseconds(innerIterEndTime - innerIterStartTime),
E_0, f.Value(),
c_e.lpNorm<1>() + (c_i - s).lpNorm<1>());
}

++iterations;
Expand Down

0 comments on commit 7cc2c82

Please sign in to comment.