Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
igl::mosek Namespace Reference

Classes

struct  MosekData
 

Functions

template<typename DerivedV , typename DerivedEle , typename Derivedb , typename Derivedbc , typename DerivedW >
IGL_INLINE bool bbw (const Eigen::PlainObjectBase< DerivedV > &V, const Eigen::PlainObjectBase< DerivedEle > &Ele, const Eigen::PlainObjectBase< Derivedb > &b, const Eigen::PlainObjectBase< Derivedbc > &bc, igl::BBWData &data, igl::mosek::MosekData &mosek_data, Eigen::PlainObjectBase< DerivedW > &W)
 
IGL_INLINE MSKrescodee mosek_guarded (const MSKrescodee r)
 
IGL_INLINE bool mosek_linprog (const Eigen::VectorXd &c, const Eigen::SparseMatrix< double > &A, const Eigen::VectorXd &lc, const Eigen::VectorXd &uc, const Eigen::VectorXd &lx, const Eigen::VectorXd &ux, Eigen::VectorXd &x)
 
IGL_INLINE bool mosek_linprog (const Eigen::VectorXd &c, const Eigen::SparseMatrix< double > &A, const Eigen::VectorXd &lc, const Eigen::VectorXd &uc, const Eigen::VectorXd &lx, const Eigen::VectorXd &ux, const MSKenv_t &env, Eigen::VectorXd &x)
 
template<typename Index , typename Scalar >
IGL_INLINE bool mosek_quadprog (const Index n, std::vector< Index > &Qi, std::vector< Index > &Qj, std::vector< Scalar > &Qv, const std::vector< Scalar > &c, const Scalar cf, const Index m, std::vector< Scalar > &Av, std::vector< Index > &Ari, const std::vector< Index > &Acp, const std::vector< Scalar > &lc, const std::vector< Scalar > &uc, const std::vector< Scalar > &lx, const std::vector< Scalar > &ux, MosekData &mosek_data, std::vector< Scalar > &x)
 
IGL_INLINE bool mosek_quadprog (const Eigen::SparseMatrix< double > &Q, const Eigen::VectorXd &c, const double cf, const Eigen::SparseMatrix< double > &A, const Eigen::VectorXd &lc, const Eigen::VectorXd &uc, const Eigen::VectorXd &lx, const Eigen::VectorXd &ux, MosekData &mosek_data, Eigen::VectorXd &x)
 

Function Documentation

◆ bbw()

template<typename DerivedV , typename DerivedEle , typename Derivedb , typename Derivedbc , typename DerivedW >
IGL_INLINE bool igl::mosek::bbw ( const Eigen::PlainObjectBase< DerivedV > &  V,
const Eigen::PlainObjectBase< DerivedEle > &  Ele,
const Eigen::PlainObjectBase< Derivedb > &  b,
const Eigen::PlainObjectBase< Derivedbc > &  bc,
igl::BBWData data,
igl::mosek::MosekData mosek_data,
Eigen::PlainObjectBase< DerivedW > &  W 
)
32{
33 using namespace std;
34 using namespace Eigen;
35 assert(!data.partition_unity && "partition_unity not implemented yet");
36 // number of domain vertices
37 int n = V.rows();
38 // number of handles
39 int m = bc.cols();
40 // Build biharmonic operator
42 harmonic(V,Ele,2,Q);
43 W.derived().resize(n,m);
44 // No linear terms
45 VectorXd c = VectorXd::Zero(n);
46 // No linear constraints
48 VectorXd uc(0,1),lc(0,1);
49 // Upper and lower box constraints (Constant bounds)
50 VectorXd ux = VectorXd::Ones(n);
51 VectorXd lx = VectorXd::Zero(n);
52 // Loop over handles
53 for(int i = 0;i<m;i++)
54 {
55 if(data.verbosity >= 1)
56 {
57 cout<<"BBW: Computing weight for handle "<<i+1<<" out of "<<m<<
58 "."<<endl;
59 }
60 VectorXd bci = bc.col(i);
61 VectorXd Wi;
62 // impose boundary conditions via bounds
63 slice_into(bci,b,ux);
64 slice_into(bci,b,lx);
65 bool r = mosek_quadprog(Q,c,0,A,lc,uc,lx,ux,mosek_data,Wi);
66 if(!r)
67 {
68 return false;
69 }
70 W.col(i) = Wi;
71 }
72#ifndef NDEBUG
73 const double min_rowsum = W.rowwise().sum().array().abs().minCoeff();
74 if(min_rowsum < 0.1)
75 {
76 cerr<<"bbw.cpp: Warning, minimum row sum is very low. Consider more "
77 "active set iterations or enforcing partition of unity."<<endl;
78 }
79#endif
80
81 return true;
82}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition PlainObjectBase.h:279
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const
Definition PlainObjectBase.h:151
A versatible sparse matrix representation.
Definition SparseMatrix.h:98
Definition LDLT.h:16
IGL_INLINE void slice_into(const Eigen::SparseMatrix< T > &X, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &R, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &C, Eigen::SparseMatrix< T > &Y)
Definition slice_into.cpp:16
IGL_INLINE bool harmonic(const Eigen::MatrixBase< DerivedV > &V, const Eigen::MatrixBase< DerivedF > &F, const Eigen::MatrixBase< Derivedb > &b, const Eigen::MatrixBase< Derivedbc > &bc, const int k, Eigen::PlainObjectBase< DerivedW > &W)
Definition harmonic.cpp:26
STL namespace.

References igl::harmonic(), mosek_quadprog(), Eigen::PlainObjectBase< Derived >::resize(), Eigen::PlainObjectBase< Derived >::rows(), and igl::slice_into().

+ Here is the call graph for this function:

◆ mosek_guarded()

IGL_INLINE MSKrescodee igl::mosek::mosek_guarded ( const MSKrescodee  r)
12{
13 using namespace std;
14 if(r != MSK_RES_OK)
15 {
16 /* In case of an error print error code and description. */
17 char symname[MSK_MAX_STR_LEN];
18 char desc[MSK_MAX_STR_LEN];
19 MSK_getcodedesc(r,symname,desc);
20 cerr<<"MOSEK ERROR ("<<r<<"): "<<symname<<" - '"<<desc<<"'"<<endl;
21 }
22 return r;
23}

Referenced by mosek_linprog(), mosek_linprog(), and mosek_quadprog().

+ Here is the caller graph for this function:

◆ mosek_linprog() [1/2]

IGL_INLINE bool igl::mosek::mosek_linprog ( const Eigen::VectorXd &  c,
const Eigen::SparseMatrix< double > &  A,
const Eigen::VectorXd &  lc,
const Eigen::VectorXd &  uc,
const Eigen::VectorXd &  lx,
const Eigen::VectorXd &  ux,
const MSKenv_t &  env,
Eigen::VectorXd &  x 
)
46{
47 // following http://docs.mosek.com/7.1/capi/Linear_optimization.html
48 using namespace std;
49 // number of constraints
50 const int m = A.rows();
51 // number of variables
52 const int n = A.cols();
53
54
55 vector<double> vAv;
56 vector<int> vAri,vAcp;
57 int nr;
58 harwell_boeing(A,nr,vAv,vAri,vAcp);
59
60 MSKtask_t task;
61 // Create the optimization task
62 mosek_guarded(MSK_maketask(env,m,n,&task));
63 // no threads
64 mosek_guarded(MSK_putintparam(task,MSK_IPAR_NUM_THREADS,1));
65 if(m>0)
66 {
67 // Append 'm' empty constraints, the constrainst will initially have no
68 // bounds
69 mosek_guarded(MSK_appendcons(task,m));
70 }
71 mosek_guarded(MSK_appendvars(task,n));
72
73
74 const auto & key = [](const double lxj, const double uxj) ->
75 MSKboundkeye
76 {
77 MSKboundkeye k = MSK_BK_FR;
78 if(isfinite(lxj) && isfinite(uxj))
79 {
80 if(lxj == uxj)
81 {
82 k = MSK_BK_FX;
83 }else{
84 k = MSK_BK_RA;
85 }
86 }else if(isfinite(lxj))
87 {
88 k = MSK_BK_LO;
89 }else if(isfinite(uxj))
90 {
91 k = MSK_BK_UP;
92 }
93 return k;
94 };
95
96 // loop over variables
97 for(int j = 0;j<n;j++)
98 {
99 if(c.size() > 0)
100 {
101 // Set linear term c_j in the objective
102 mosek_guarded(MSK_putcj(task,j,c(j)));
103 }
104
105 // Set constant bounds on variable j
106 const double lxj = lx.size()>0?lx[j]:-numeric_limits<double>::infinity();
107 const double uxj = ux.size()>0?ux[j]: numeric_limits<double>::infinity();
108 mosek_guarded(MSK_putvarbound(task,j,key(lxj,uxj),lxj,uxj));
109
110 if(m>0)
111 {
112 // Input column j of A
114 MSK_putacol(
115 task,
116 j,
117 vAcp[j+1]-vAcp[j],
118 &vAri[vAcp[j]],
119 &vAv[vAcp[j]])
120 );
121 }
122 }
123 // loop over constraints
124 for(int i = 0;i<m;i++)
125 {
126 // Set constraint bounds for row i
127 const double lci = lc.size()>0?lc[i]:-numeric_limits<double>::infinity();
128 const double uci = uc.size()>0?uc[i]: numeric_limits<double>::infinity();
129 mosek_guarded(MSK_putconbound(task,i,key(lci,uci),lci,uci));
130 }
131
132 // Now the optimizer has been prepared
133 MSKrescodee trmcode;
134 // run the optimizer
135 mosek_guarded(MSK_optimizetrm(task,&trmcode));
136 // Get status
137 MSKsolstae solsta;
138 MSK_getsolsta (task,MSK_SOL_ITR,&solsta);
139 bool success = false;
140 switch(solsta)
141 {
142 case MSK_SOL_STA_OPTIMAL:
143 case MSK_SOL_STA_NEAR_OPTIMAL:
144 x.resize(n);
145 /* Request the basic solution. */
146 MSK_getxx(task,MSK_SOL_BAS,x.data());
147 success = true;
148 break;
149 case MSK_SOL_STA_DUAL_INFEAS_CER:
150 case MSK_SOL_STA_PRIM_INFEAS_CER:
151 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
152 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
153 //printf("Primal or dual infeasibility certificate found.\n");
154 break;
155 case MSK_SOL_STA_UNKNOWN:
156 //printf("The status of the solution could not be determined.\n");
157 break;
158 default:
159 //printf("Other solution status.");
160 break;
161 }
162 MSK_deletetask(&task);
163 return success;
164}
Index rows() const
Definition SparseMatrix.h:136
Index cols() const
Definition SparseMatrix.h:138
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool() isfinite(const half &a)
Definition Half.h:441
IGL_INLINE MSKrescodee mosek_guarded(const MSKrescodee r)
Definition mosek_guarded.cpp:11
IGL_INLINE void harwell_boeing(const Eigen::SparseMatrix< Scalar > &A, int &num_rows, std::vector< Scalar > &V, std::vector< Index > &R, std::vector< Index > &C)
Definition harwell_boeing.cpp:11
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297

References Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >::cols(), igl::harwell_boeing(), mosek_guarded(), and Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >::rows().

+ Here is the call graph for this function:

◆ mosek_linprog() [2/2]

IGL_INLINE bool igl::mosek::mosek_linprog ( const Eigen::VectorXd &  c,
const Eigen::SparseMatrix< double > &  A,
const Eigen::VectorXd &  lc,
const Eigen::VectorXd &  uc,
const Eigen::VectorXd &  lx,
const Eigen::VectorXd &  ux,
Eigen::VectorXd &  x 
)
23{
24 // variables for mosek task, env and result code
25 MSKenv_t env;
26 // Create the MOSEK environment
27 mosek_guarded(MSK_makeenv(&env,NULL));
28 // initialize mosek environment
29#if MSK_VERSION_MAJOR <= 7
30 mosek_guarded(MSK_initenv(env));
31#endif
32 const bool ret = mosek_linprog(c,A,lc,uc,lx,ux,env,x);
33 MSK_deleteenv(&env);
34 return ret;
35}
IGL_INLINE bool mosek_linprog(const Eigen::VectorXd &c, const Eigen::SparseMatrix< double > &A, const Eigen::VectorXd &lc, const Eigen::VectorXd &uc, const Eigen::VectorXd &lx, const Eigen::VectorXd &ux, Eigen::VectorXd &x)
Definition mosek_linprog.cpp:15

References mosek_guarded(), and mosek_linprog().

Referenced by mosek_linprog().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mosek_quadprog() [1/2]

IGL_INLINE bool igl::mosek::mosek_quadprog ( const Eigen::SparseMatrix< double > &  Q,
const Eigen::VectorXd &  c,
const double  cf,
const Eigen::SparseMatrix< double > &  A,
const Eigen::VectorXd &  lc,
const Eigen::VectorXd &  uc,
const Eigen::VectorXd &  lx,
const Eigen::VectorXd &  ux,
MosekData mosek_data,
Eigen::VectorXd &  x 
)
286{
287 using namespace Eigen;
288 using namespace std;
289
290 typedef int Index;
291 typedef double Scalar;
292 // Q should be square
293 assert(Q.rows() == Q.cols());
294 // Q should be symmetric
295#ifdef EIGEN_HAS_A_BUG_AND_FAILS_TO_LET_ME_COMPUTE_Q_MINUS_Q_TRANSPOSE
296 assert( (Q-Q.transpose()).sum() < FLOAT_EPS);
297#endif
298 // Only keep lower triangular part of Q
300 //QL = Q.template triangularView<Lower>();
301 QL = Q.triangularView<Lower>();
302 VectorXi Qi,Qj;
303 VectorXd Qv;
304 find(QL,Qi,Qj,Qv);
305 vector<Index> vQi = matrix_to_list(Qi);
306 vector<Index> vQj = matrix_to_list(Qj);
307 vector<Scalar> vQv = matrix_to_list(Qv);
308
309 // Convert linear term
310 vector<Scalar> vc = matrix_to_list(c);
311
312 assert(lc.size() == A.rows());
313 assert(uc.size() == A.rows());
314 // Convert A to harwell boeing format
315 vector<Scalar> vAv;
316 vector<Index> vAr,vAc;
317 Index nr;
318 harwell_boeing(A,nr,vAv,vAr,vAc);
319
320 assert(lx.size() == Q.rows());
321 assert(ux.size() == Q.rows());
322 vector<Scalar> vlc = matrix_to_list(lc);
323 vector<Scalar> vuc = matrix_to_list(uc);
324 vector<Scalar> vlx = matrix_to_list(lx);
325 vector<Scalar> vux = matrix_to_list(ux);
326
327 vector<Scalar> vx;
328 bool ret = mosek_quadprog<Index,Scalar>(
329 Q.rows(),vQi,vQj,vQv,
330 vc,
331 cf,
332 nr,
333 vAv, vAr, vAc,
334 vlc,vuc,
335 vlx,vux,
336 mosek_data,
337 vx);
338 list_to_matrix(vx,x);
339 return ret;
340}
const TriangularView< const Derived, Mode > triangularView() const
Definition SparseTriangularView.h:182
TransposeReturnType transpose()
Definition SparseMatrixBase.h:349
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:33
IGL_INLINE void find(const Eigen::SparseMatrix< T > &X, Eigen::DenseBase< DerivedI > &I, Eigen::DenseBase< DerivedJ > &J, Eigen::DenseBase< DerivedV > &V)
Definition find.cpp:18
IGL_INLINE void matrix_to_list(const Eigen::DenseBase< DerivedM > &M, std::vector< std::vector< typename DerivedM::Scalar > > &V)
Definition matrix_to_list.cpp:13
IGL_INLINE bool list_to_matrix(const std::vector< std::vector< T > > &V, Eigen::PlainObjectBase< Derived > &M)
Definition list_to_matrix.cpp:19

References Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >::cols(), igl::find(), igl::FLOAT_EPS, igl::harwell_boeing(), igl::list_to_matrix(), igl::matrix_to_list(), Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >::rows(), Eigen::SparseMatrixBase< Derived >::transpose(), and Eigen::SparseMatrixBase< Derived >::triangularView().

+ Here is the call graph for this function:

◆ mosek_quadprog() [2/2]

template<typename Index , typename Scalar >
IGL_INLINE bool igl::mosek::mosek_quadprog ( const Index  n,
std::vector< Index > &  Qi,
std::vector< Index > &  Qj,
std::vector< Scalar > &  Qv,
const std::vector< Scalar > &  c,
const Scalar  cf,
const Index  m,
std::vector< Scalar > &  Av,
std::vector< Index > &  Ari,
const std::vector< Index > &  Acp,
const std::vector< Scalar > &  lc,
const std::vector< Scalar > &  uc,
const std::vector< Scalar > &  lx,
const std::vector< Scalar > &  ux,
MosekData mosek_data,
std::vector< Scalar > &  x 
)
  • Directs the log stream to the 'printstr' function. *‍/ / Little function mosek needs in order to know how to print to std out
82{
83 // I J V vectors of Q should all be same length
84 assert(Qv.size() == Qi.size());
85 assert(Qv.size() == Qj.size());
86 // number of columns in linear constraint matrix must be ≤ number of
87 // variables
88 assert( (int)Acp.size() == (n+1));
89 // linear bound vectors must be size of number of constraints or empty
90 assert( ((int)lc.size() == m) || ((int)lc.size() == 0));
91 assert( ((int)uc.size() == m) || ((int)uc.size() == 0));
92 // constant bound vectors must be size of number of variables or empty
93 assert( ((int)lx.size() == n) || ((int)lx.size() == 0));
94 assert( ((int)ux.size() == n) || ((int)ux.size() == 0));
95
96 // allocate space for solution in x
97 x.resize(n);
98
99 // variables for mosek task, env and result code
100 MSKenv_t env;
101 MSKtask_t task;
102
103 // Create the MOSEK environment
104#if MSK_VERSION_MAJOR >= 7
105 mosek_guarded(MSK_makeenv(&env,NULL));
106#elif MSK_VERSION_MAJOR == 6
107 mosek_guarded(MSK_makeenv(&env,NULL,NULL,NULL,NULL));
108#endif
111 //const auto & printstr = [](void *handle, char str[])
112 //{
113 // printf("%s",str);
114 //}
115 //mosek_guarded(MSK_linkfunctoenvstream(env,MSK_STREAM_LOG,NULL,printstr));
116 // initialize mosek environment
117#if MSK_VERSION_MAJOR <= 7
118 mosek_guarded(MSK_initenv(env));
119#endif
120 // Create the optimization task
121 mosek_guarded(MSK_maketask(env,m,n,&task));
122 verbose("Creating task with %ld linear constraints and %ld variables...\n",m,n);
124 //mosek_guarded(MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr));
125 // Give estimate of number of variables
126 mosek_guarded(MSK_putmaxnumvar(task,n));
127 if(m>0)
128 {
129 // Give estimate of number of constraints
130 mosek_guarded(MSK_putmaxnumcon(task,m));
131 // Give estimate of number of non zeros in A
132 mosek_guarded(MSK_putmaxnumanz(task,Av.size()));
133 }
134 // Give estimate of number of non zeros in Q
135 mosek_guarded(MSK_putmaxnumqnz(task,Qv.size()));
136 if(m>0)
137 {
138 // Append 'm' empty constraints, the constrainst will initially have no
139 // bounds
140#if MSK_VERSION_MAJOR >= 7
141 mosek_guarded(MSK_appendcons(task,m));
142#elif MSK_VERSION_MAJOR == 6
143 mosek_guarded(MSK_append(task,MSK_ACC_CON,m));
144#endif
145 }
146 // Append 'n' variables
147#if MSK_VERSION_MAJOR >= 7
148 mosek_guarded(MSK_appendvars(task,n));
149#elif MSK_VERSION_MAJOR == 6
150 mosek_guarded(MSK_append(task,MSK_ACC_VAR,n));
151#endif
152 // add a contant term to the objective
153 mosek_guarded(MSK_putcfix(task,cf));
154
155 // loop over variables
156 for(int j = 0;j<n;j++)
157 {
158 if(c.size() > 0)
159 {
160 // Set linear term c_j in the objective
161 mosek_guarded(MSK_putcj(task,j,c[j]));
162 }
163
164 // Set constant bounds on variable j
165 if(lx[j] == ux[j])
166 {
167 mosek_guarded(MSK_putbound(task,MSK_ACC_VAR,j,MSK_BK_FX,lx[j],ux[j]));
168 }else
169 {
170 mosek_guarded(MSK_putbound(task,MSK_ACC_VAR,j,MSK_BK_RA,lx[j],ux[j]));
171 }
172
173 if(m>0)
174 {
175 // Input column j of A
176#if MSK_VERSION_MAJOR >= 7
178 MSK_putacol(
179 task,
180 j,
181 Acp[j+1]-Acp[j],
182 &Ari[Acp[j]],
183 &Av[Acp[j]])
184 );
185#elif MSK_VERSION_MAJOR == 6
187 MSK_putavec(
188 task,
189 MSK_ACC_VAR,
190 j,
191 Acp[j+1]-Acp[j],
192 &Ari[Acp[j]],
193 &Av[Acp[j]])
194 );
195#endif
196 }
197 }
198
199 // loop over constraints
200 for(int i = 0;i<m;i++)
201 {
202 // put bounds on constraints
203 mosek_guarded(MSK_putbound(task,MSK_ACC_CON,i,MSK_BK_RA,lc[i],uc[i]));
204 }
205
206 // Input Q for the objective (REMEMBER Q SHOULD ONLY BE LOWER TRIANGLE)
207 mosek_guarded(MSK_putqobj(task,Qv.size(),&Qi[0],&Qj[0],&Qv[0]));
208
209 // Set up task parameters
210 for(
211 std::map<MSKiparame,int>::iterator pit = mosek_data.intparam.begin();
212 pit != mosek_data.intparam.end();
213 pit++)
214 {
215 mosek_guarded(MSK_putintparam(task,pit->first,pit->second));
216 }
217 for(
218 std::map<MSKdparame,double>::iterator pit = mosek_data.douparam.begin();
219 pit != mosek_data.douparam.end();
220 pit++)
221 {
222 mosek_guarded(MSK_putdouparam(task,pit->first,pit->second));
223 }
224
225 // Now the optimizer has been prepared
226 MSKrescodee trmcode;
227 // run the optimizer
228 mosek_guarded(MSK_optimizetrm(task,&trmcode));
229
232 //MSK_solutionsummary(task,MSK_STREAM_LOG);
233
234 // Get status of solution
235 MSKsolstae solsta;
236#if MSK_VERSION_MAJOR >= 7
237 MSK_getsolsta (task,MSK_SOL_ITR,&solsta);
238#elif MSK_VERSION_MAJOR == 6
239 MSK_getsolutionstatus(task,MSK_SOL_ITR,NULL,&solsta);
240#endif
241
242 bool success = false;
243 switch(solsta)
244 {
245 case MSK_SOL_STA_OPTIMAL:
246 case MSK_SOL_STA_NEAR_OPTIMAL:
247 MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_XX,0,n,&x[0]);
248 //printf("Optimal primal solution\n");
249 //for(size_t j=0; j<n; ++j)
250 //{
251 // printf("x[%ld]: %g\n",j,x[j]);
252 //}
253 success = true;
254 break;
255 case MSK_SOL_STA_DUAL_INFEAS_CER:
256 case MSK_SOL_STA_PRIM_INFEAS_CER:
257 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
258 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
259 //printf("Primal or dual infeasibility certificate found.\n");
260 break;
261 case MSK_SOL_STA_UNKNOWN:
262 //printf("The status of the solution could not be determined.\n");
263 break;
264 default:
265 //printf("Other solution status.");
266 break;
267 }
268
269 MSK_deletetask(&task);
270 MSK_deleteenv(&env);
271
272 return success;
273}
int verbose
Definition main.c:198
std::map< MSKiparame, int > intparam
Definition mosek_quadprog.h:27
std::map< MSKdparame, double > douparam
Definition mosek_quadprog.h:29

References igl::mosek::MosekData::douparam, igl::mosek::MosekData::intparam, mosek_guarded(), and verbose.

Referenced by bbw().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: