AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
QPSolverWrapper.cc
Go to the documentation of this file.
1 
25 #include "QPSolverWrapper.h"
26 
27 #include <cmath>
28 
30 {
31  // osqp::OsqpSolver &osqpSolver = curSolver->osqpSolver;
32 
33  Eigen::ConjugateGradient<Eigen::SparseMatrix<double>, Eigen::Lower | Eigen::Upper> &CGSolver = curSolver->CGSolver;
34  std::vector<Eigen::Triplet<float>> &objectiveMatrixTripletList = curSolver->solverData.objectiveMatrixTripletList;
35  Eigen::VectorXd &objectiveVector = curSolver->solverData.objectiveVector;
36 
37  // min_x 0.5 * x'Px + q'x
38  // s.t. l <= Ax <= u
39 
40  // objective_matrix is P.
41  // objective_vector is q.
42  // constraint_matrix is A.
43  // lower_bounds is l.
44  // upper_bounds is u.
45 
46  Eigen::SparseMatrix<double> objective_matrix(objectiveVector.size(), objectiveVector.size());
47  for (unsigned int i = 0; i < objectiveVector.size(); i++)
48  objectiveMatrixTripletList.push_back(Eigen::Triplet<float>(i, i, curSolver->solverData.objectiveMatrixDiag[i]));
49  objective_matrix.setFromTriplets(objectiveMatrixTripletList.begin(), objectiveMatrixTripletList.end());
50 
51  if (curSolver->solverSettings.useUnconstrainedCG)
52  {
54  // Conjugate Gradient (does not support constraint yet.)
55  if (curSolver->solverSettings.verbose)
56  print_status("Unconstrained CG Solver Started.");
57  CGSolver.setMaxIterations(curSolver->solverSettings.maxIters);
58  CGSolver.setTolerance(curSolver->solverSettings.tolerence);
59  CGSolver.compute(objective_matrix);
60  if (curSolver->solverSettings.solutionForward)
61  curSolver->solverData.oriSolution =
62  CGSolver.solveWithGuess(-objectiveVector, curSolver->solverData.oriSolution);
63  else
64  curSolver->solverData.solution =
65  CGSolver.solveWithGuess(-objectiveVector, curSolver->solverData.oriSolution);
66  if (curSolver->solverSettings.verbose)
67  print_status("Unconstrained CG Solver Done.");
68  }
69  else
70  {
71  assert(false && "Currently, OSQP is disabled to make the project size smaller!");
73  // // OSQP (support constraints but runtime x2~3)
74  // Eigen::SparseMatrix<double> constraint_matrix(objectiveVector.size(), objectiveVector.size());
75  // std::vector<Eigen::Triplet<float>> constraints;
76  // for (unsigned int i = 0; i < objectiveVector.size(); i++)
77  // {
78  // constraints.push_back(Eigen::Triplet<float>(i, i, 1.0));
79  // }
80  // constraint_matrix.setFromTriplets(constraints.begin(), constraints.end());
81 
82  // osqp::OsqpInstance instance;
83  // instance.objective_matrix = objective_matrix;
84  // instance.objective_vector = objectiveVector;
85  // instance.constraint_matrix = constraint_matrix;
86  // instance.lower_bounds.resize(objectiveVector.size());
87  // for (unsigned int i = 0; i < objectiveVector.size(); i++)
88  // {
89  // instance.lower_bounds[i] = curSolver->solverSettings.lowerbound;
90  // }
91  // instance.upper_bounds.resize(objectiveVector.size());
92  // for (unsigned int i = 0; i < objectiveVector.size(); i++)
93  // {
94  // instance.upper_bounds[i] = curSolver->solverSettings.upperbound;
95  // }
96 
97  // osqp::OsqpSettings settings;
98  // settings.verbose = false;
99 
100  // if (curSolver->solverSettings.verbose)
101  // print_status("OSQP Solver initializing.");
102 
103  // auto status = osqpSolver.Init(instance, settings, curSolver->solverSettings.MKLorNot);
104  // assert(status.ok());
105 
106  // if (curSolver->solverSettings.verbose)
107  // print_status("OSQP Solver Started.");
108 
109  // status = osqpSolver.SetPrimalWarmStart(curSolver->solverData.oriSolution);
110  // assert(status.ok());
111 
112  // osqp::OsqpExitCode exit_code = osqpSolver.Solve();
113  // assert(exit_code == osqp::OsqpExitCode::kOptimal);
114 
115  // // if need to trace the objective, uncomment the line below
116  // // double optimal_objective = osqpSolver.objective_value();
117 
118  // if (curSolver->solverSettings.solutionForward)
119  // curSolver->solverData.oriSolution = osqpSolver.primal_solution();
120  // else
121  // curSolver->solverData.solution = osqpSolver.primal_solution();
122 
123  // if (curSolver->solverSettings.verbose)
124  // print_status("OSQP Solver Done.");
125  }
126 }
QPSolverWrapper::solverSettingsType::solutionForward
bool solutionForward
Definition: QPSolverWrapper.h:64
QPSolverWrapper::solverData
solverDataType solverData
Definition: QPSolverWrapper.h:52
QPSolverWrapper::solverDataType::objectiveMatrixDiag
std::vector< float > objectiveMatrixDiag
Definition: QPSolverWrapper.h:46
QPSolverWrapper::solverSettingsType::tolerence
float tolerence
Definition: QPSolverWrapper.h:63
QPSolverWrapper::solverSettingsType::maxIters
int maxIters
Definition: QPSolverWrapper.h:62
print_status
void print_status(std::string tmp_string)
Definition: strPrint.cc:44
QPSolverWrapper
Definition: QPSolverWrapper.h:41
QPSolverWrapper::CGSolver
Eigen::ConjugateGradient< Eigen::SparseMatrix< double >, Eigen::Lower|Eigen::Upper > CGSolver
Definition: QPSolverWrapper.h:55
QPSolverWrapper::solverDataType::oriSolution
Eigen::VectorXd oriSolution
Definition: QPSolverWrapper.h:49
QPSolverWrapper::solverSettingsType::verbose
bool verbose
Definition: QPSolverWrapper.h:65
QPSolverWrapper::solverSettings
solverSettingsType solverSettings
Definition: QPSolverWrapper.h:67
QPSolverWrapper.h
QPSolverWrapper::solverDataType::objectiveVector
Eigen::VectorXd objectiveVector
Definition: QPSolverWrapper.h:47
checkHalfColumn.i
int i
Definition: checkHalfColumn.py:5
QPSolverWrapper::QPSolve
static void QPSolve(QPSolverWrapper *&curSolver)
Definition: QPSolverWrapper.cc:29
QPSolverWrapper::solverDataType::solution
Eigen::VectorXd solution
Definition: QPSolverWrapper.h:48
QPSolverWrapper::solverSettingsType::useUnconstrainedCG
bool useUnconstrainedCG
Definition: QPSolverWrapper.h:58
QPSolverWrapper::solverDataType::objectiveMatrixTripletList
std::vector< Eigen::Triplet< float > > objectiveMatrixTripletList
Definition: QPSolverWrapper.h:45