24#include <unsupported/Eigen/SparseExtra>
30template <
typename T,
typename Derivedknown>
32 const Eigen::SparseMatrix<T>& A2,
33 const Eigen::MatrixBase<Derivedknown> & known,
34 const Eigen::SparseMatrix<T>& Aeq,
40 const Eigen::SparseMatrix<T> A = 0.5*A2;
41#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
53 assert(n == Aeq.cols() &&
"#Aeq.cols() should match A.rows()");
56 assert(known.cols() == 1 &&
"known should be a vector");
57 assert(A.rows() == n &&
"A should be square");
58 assert(A.cols() == n &&
"A should be square");
61 int kr = known.size();
63 assert((kr == 0 || known.minCoeff() >= 0)&&
"known indices should be in [0,n)");
64 assert((kr == 0 || known.maxCoeff() < n) &&
"known indices should be in [0,n)");
65 assert(neq <= n &&
"Number of equality constraints should be less than DOFs");
70 data.
known = known.template cast<int>();
74 std::vector<bool> unknown_mask;
75 unknown_mask.resize(n,
true);
76 for(
int i = 0;i<kr;i++)
78 unknown_mask[known(i, 0)] =
false;
81 for(
int i = 0;i<n;i++)
91 for(
int i = 0;i<neq;i++)
110 Eigen::SparseMatrix<T> Auu;
112 assert(Auu.size() != 0 && Auu.rows() > 0 &&
"There should be at least one unknown.");
124 "Auu should be symmetric if positive definite");
128 Eigen::VectorXi AuuI,AuuJ;
129 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> AuuV;
130 find(Auu,AuuI,AuuJ,AuuV);
138#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
143 assert(data.
Aequ.rows() == neq &&
144 "#Rows in Aequ should match #constraints");
146 "#cols in Aequ should match #unknowns");
147 data.
AeqTQR.compute(data.
Aequ.transpose().eval());
148#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
151 switch(data.
AeqTQR.info())
155 case Eigen::NumericalIssue:
156#ifdef IGL_MIN_QUAD_WITH_FIXED_CPP_DEBUG
157 cerr<<
"Error: Numerical issue."<<endl;
160 case Eigen::InvalidInput:
161#ifdef IGL_MIN_QUAD_WITH_FIXED_CPP_DEBUG
162 cerr<<
"Error: Invalid input."<<endl;
166#ifdef IGL_MIN_QUAD_WITH_FIXED_CPP_DEBUG
167 cerr<<
"Error: Other."<<endl;
173 "Rank of reduced constraints should be <= #original constraints");
183#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
184 cout<<
" Aeq_li=true"<<endl;
187 Eigen::SparseMatrix<T> new_A;
188 Eigen::SparseMatrix<T> AeqT = Aeq.transpose();
189 Eigen::SparseMatrix<T> Z(neq,neq);
191 new_A =
cat(1,
cat(2, A, AeqT ),
197 Eigen::SparseMatrix<T> Aulk,Akul;
209 Eigen::SparseMatrix<T> AkulT = Akul.transpose();
210 data.
preY = Aulk + AkulT;
219#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
220 cout<<
" factorize"<<endl;
222 if(data.
Auu_pd && neq == 0)
224#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
227 data.
llt.compute(Auu);
228 switch(data.
llt.info())
232 case Eigen::NumericalIssue:
233#ifdef IGL_MIN_QUAD_WITH_FIXED_CPP_DEBUG
234 cerr<<
"Error: Numerical issue."<<endl;
238#ifdef IGL_MIN_QUAD_WITH_FIXED_CPP_DEBUG
239 cerr<<
"Error: Other."<<endl;
246#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
247 cout<<
" ldlt/lu"<<endl;
250 Eigen::SparseMatrix<T> NA;
255#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
258 data.
ldlt.compute(NA);
259 switch(data.
ldlt.info())
263 case Eigen::NumericalIssue:
264#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
265 cerr<<
"Error: Numerical issue."<<endl;
269#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
270 cerr<<
"Error: Other."<<endl;
277#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
284 switch(data.
lu.info())
288 case Eigen::NumericalIssue:
289#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
290 cerr<<
"Error: Numerical issue."<<endl;
293 case Eigen::InvalidInput:
294#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
295 cerr<<
"Error: Invalid Input."<<endl;
299#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
300 cerr<<
"Error: Other."<<endl;
309#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
310 cout<<
" Aeq_li=false"<<endl;
313 const int nu = data.
unknown.size();
318 Eigen::SparseMatrix<T> AeqTR,AeqTQ;
319 AeqTR = data.
AeqTQR.matrixR();
321 AeqTR.prune(
static_cast<T
>(0.0));
322#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
323 cout<<
" matrixQ"<<endl;
327 AeqTQ = data.
AeqTQR.matrixQ();
328#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
329 cout<<
" prune"<<endl;
330 cout<<
" nnz: "<<AeqTQ.nonZeros()<<endl;
333 AeqTQ.prune(
static_cast<T
>(0.0));
337#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
338 cout<<
" nnz: "<<AeqTQ.nonZeros()<<endl;
341 Eigen::SparseMatrix<T> I(neq,neq);
344 data.
AeqTET = data.
AeqTQR.colsPermutation().transpose() * I;
345 assert(AeqTR.rows() == nu &&
"#rows in AeqTR should match #unknowns");
346 assert(AeqTR.cols() == neq &&
"#cols in AeqTR should match #constraints");
347 assert(AeqTQ.rows() == nu &&
"#rows in AeqTQ should match #unknowns");
348 assert(AeqTQ.cols() == nu &&
"#cols in AeqTQ should match #unknowns");
350#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
351 cout<<
" slice"<<endl;
353 data.
AeqTQ1 = AeqTQ.topLeftCorner(nu,nc);
356 data.
AeqTR1 = AeqTR.topLeftCorner(nc,nc);
360 data.
AeqTQ2 = AeqTQ.bottomRightCorner(nu,nu-nc);
362#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
366 Eigen::SparseMatrix<T> QRAuu = data.
AeqTQ2T * Auu * data.
AeqTQ2;
368#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
369 cout<<
" factorize"<<endl;
372 data.
llt.compute(QRAuu);
373 switch(data.
llt.info())
377 case Eigen::NumericalIssue:
378#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
379 cerr<<
"Error: Numerical issue."<<endl;
383#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
384 cerr<<
"Error: Other."<<endl;
390#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
391 cout<<
" smash"<<endl;
394 Eigen::SparseMatrix<T> Auk;
396 Eigen::SparseMatrix<T> Aku;
398 Eigen::SparseMatrix<T> AkuT = Aku.transpose();
399 data.
preY = Auk + AkuT;
403 assert(data.
Aeqk.rows() == neq);
404 assert(data.
Aeqk.cols() == data.
known.size());
419 const Eigen::MatrixBase<DerivedB> & B,
420 const Eigen::MatrixBase<DerivedY> & Y,
421 const Eigen::MatrixBase<DerivedBeq> & Beq,
422 Eigen::PlainObjectBase<DerivedZ> & Z,
423 Eigen::PlainObjectBase<Derivedsol> & sol)
425 typedef Eigen::Matrix<T ,Eigen::Dynamic ,Eigen::Dynamic> MatrixXT;
427 int kr = data.
known.size();
430 assert(kr == Y.rows());
434 assert(B.cols() == 1 || B.cols() == cols);
435 assert(Beq.size() == 0 || Beq.cols() == 1 || Beq.cols() == cols);
438 Z.resize(data.
n,cols);
440 for(
int i = 0;i < kr;i++)
442 for(
int j = 0;j < cols;j++)
444 Z(data.
known(i),j) = Y(i,j);
453 MatrixXT BBeq(B.rows() + Beq.rows(),cols);
456 BBeq.topLeftCorner(B.rows(),cols) = B.replicate(1,B.cols()==cols?1:cols);
460 BBeq.bottomLeftCorner(Beq.rows(),cols) = -2.0*Beq.replicate(1,Beq.cols()==cols?1:cols);
471 NB = data.
preY * Y + BBequlcols;
479 sol = data.
llt.solve(NB);
482 sol = data.
ldlt.solve(NB);
486 sol = data.
lu.solve(NB);
489#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
490 cerr<<
"Error: invalid solver type"<<endl;
499 for(
int i = 0;i<(sol.rows()-neq);i++)
501 for(
int j = 0;j<sol.cols();j++)
513 data.
AeqTET * (-data.
Aeqk * Y + Beq.replicate(1,Beq.cols()==cols?1:cols));
517 NB = -0.5*(Bu.replicate(1,B.cols()==cols?1:cols) + data.
preY * Y);
519 const int nc = data.
AeqTQR.rank();
520 const int neq = Beq.rows();
521 eff_Beq = eff_Beq.topLeftCorner(nc,cols).eval();
522 data.
AeqTR1T.template triangularView<Eigen::Lower>().solveInPlace(eff_Beq);
525 lambda_0 = data.
AeqTQ1 * eff_Beq;
530 lambda = data.
llt.solve(QRB);
533 solu = data.
AeqTQ2 * lambda + lambda_0;
535 Derivedsol solLambda;
537 Derivedsol temp1,temp2;
539 data.
AeqTR1.template triangularView<Eigen::Upper>().solveInPlace(temp1);
541 temp2 = Derivedsol::Zero(neq,cols);
542 temp2.topLeftCorner(nc,cols) = temp1;
544 solLambda = data.
AeqTE * temp2;
547 assert(data.
unknown.size() == solu.rows());
548 assert(cols == solu.cols());
549 assert(data.
neq == neq);
550 assert(data.
neq == solLambda.rows());
551 assert(cols == solLambda.cols());
552 sol.resize(data.
unknown.size()+data.
neq,cols);
553 sol.block(0,0,solu.rows(),solu.cols()) = solu;
554 sol.block(solu.rows(),0,solLambda.rows(),solLambda.cols()) = solLambda;
555 for(
int u = 0;u<data.
unknown.size();u++)
557 for(
int j = 0;j<Z.cols();j++)
559 Z(data.
unknown(u),j) = solu(u,j);
574 const Eigen::MatrixBase<DerivedB> & B,
575 const Eigen::MatrixBase<DerivedY> & Y,
576 const Eigen::MatrixBase<DerivedBeq> & Beq,
577 Eigen::PlainObjectBase<DerivedZ> & Z)
579 Eigen::Matrix<typename DerivedZ::Scalar, Eigen::Dynamic, Eigen::Dynamic> sol;
585 typename Derivedknown,
591 const Eigen::SparseMatrix<T>& A,
592 const Eigen::MatrixBase<DerivedB> & B,
593 const Eigen::MatrixBase<Derivedknown> & known,
594 const Eigen::MatrixBase<DerivedY> & Y,
595 const Eigen::SparseMatrix<T>& Aeq,
596 const Eigen::MatrixBase<DerivedBeq> & Beq,
598 Eigen::PlainObjectBase<DerivedZ> & Z)
609template <
typename Scalar,
int n,
int m,
bool Hpd>
611 const Eigen::Matrix<Scalar,n,n> & H,
612 const Eigen::Matrix<Scalar,n,1> & f,
613 const Eigen::Array<bool,n,1> & k,
614 const Eigen::Matrix<Scalar,n,1> & bc,
615 const Eigen::Matrix<Scalar,m,n> & A,
616 const Eigen::Matrix<Scalar,m,1> & b)
618 const auto dyn_n = n == Eigen::Dynamic ? H.rows() : n;
619 const auto dyn_m = m == Eigen::Dynamic ? A.rows() : m;
620 constexpr const int nn = n == Eigen::Dynamic ? Eigen::Dynamic : n+m;
621 const auto dyn_nn = nn == Eigen::Dynamic ? dyn_n+dyn_m : nn;
629 const auto make_HH = [&]()
632 constexpr const int nn = n == Eigen::Dynamic ? Eigen::Dynamic : n+m;
633 Eigen::Matrix<Scalar,nn,nn> HH =
634 Eigen::Matrix<Scalar,nn,nn>::Zero(dyn_nn,dyn_nn);
635 HH.topLeftCorner(dyn_n,dyn_n) = H;
636 HH.bottomLeftCorner(dyn_m,dyn_n) = A;
637 HH.topRightCorner(dyn_n,dyn_m) = A.transpose();
640 const Eigen::Matrix<Scalar,nn,nn> HH = make_HH();
641 const auto make_ff = [&]()
644 constexpr const int nn = n == Eigen::Dynamic ? Eigen::Dynamic : n+m;
645 Eigen::Matrix<Scalar,nn,1> ff(dyn_nn);
650 const Eigen::Matrix<Scalar,nn,1> ff = make_ff();
651 const auto make_kk = [&]()
654 constexpr const int nn = n == Eigen::Dynamic ? Eigen::Dynamic : n+m;
655 Eigen::Array<bool,nn,1> kk =
656 Eigen::Array<bool,nn,1>::Constant(dyn_nn,1,
false);
660 const Eigen::Array<bool,nn,1> kk = make_kk();
661 const auto make_bcbc= [&]()
664 constexpr const int nn = n == Eigen::Dynamic ? Eigen::Dynamic : n+m;
665 Eigen::Matrix<Scalar,nn,1> bcbc(dyn_nn);
666 bcbc.head(dyn_n) = bc;
669 const Eigen::Matrix<Scalar,nn,1> bcbc = make_bcbc();
670 const Eigen::Matrix<Scalar,nn,1> xx =
672 return xx.head(dyn_n);
675template <
typename Scalar,
int n,
bool Hpd>
677 const Eigen::Matrix<Scalar,n,n> & H,
678 const Eigen::Matrix<Scalar,n,1> & f,
679 const Eigen::Array<bool,n,1> & k,
680 const Eigen::Matrix<Scalar,n,1> & bc)
682 assert(H.isApprox(H.transpose(),1e-7));
683 assert(H.rows() == H.cols());
684 assert(H.rows() == f.size());
685 assert(H.rows() == k.size());
686 assert(H.rows() == bc.size());
687 const auto kcount = k.count();
689 if(kcount == (Eigen::Dynamic?H.rows():n))
697 typedef Eigen::Matrix<Scalar,n,n> MatrixSn;
699 std::conditional<Hpd,Eigen::LLT<MatrixSn>,Eigen::CompleteOrthogonalDecomposition<MatrixSn>>::type
701 return Solver(H).solve(-f);
704 if( (Eigen::Dynamic?H.rows():n)-kcount == 1)
708 for(
int i=0;i<k.size();i++){
if(!k(i)){ u=i;
break; } }
713 Eigen::Matrix<Scalar,n,1> x = bc;
715 for(
int i=0;i<k.size();i++){
if(i!=u){ x(u)-=bc(i)*H(i,u); } }
726 case 0: assert(
false &&
"Handled above.");
return Eigen::Matrix<Scalar,n,1>();
731 const bool D = (n-1<=0)||(1>=n)||(n>16);
736 const bool D = (n-2<=0)||(2>=n)||(n>16);
741 const bool D = (n-3<=0)||(3>=n)||(n>16);
746 const bool D = (n-4<=0)||(4>=n)||(n>16);
751 const bool D = (n-5<=0)||(5>=n)||(n>16);
756 const bool D = (n-6<=0)||(6>=n)||(n>16);
761 const bool D = (n-7<=0)||(7>=n)||(n>16);
766 const bool D = (n-8<=0)||(8>=n)||(n>16);
771 const bool D = (n-9<=0)||(9>=n)||(n>16);
776 const bool D = (n-10<=0)||(10>=n)||(n>16);
781 const bool D = (n-11<=0)||(11>=n)||(n>16);
786 const bool D = (n-12<=0)||(12>=n)||(n>16);
791 const bool D = (n-13<=0)||(13>=n)||(n>16);
796 const bool D = (n-14<=0)||(14>=n)||(n>16);
801 const bool D = (n-15<=0)||(15>=n)||(n>16);
806 const bool D = (n-16<=0)||(16>=n)||(n>16);
814template <
typename Scalar,
int n,
int kcount,
bool Hpd>
816 const Eigen::Matrix<Scalar,n,n> & H,
817 const Eigen::Matrix<Scalar,n,1> & f,
818 const Eigen::Array<bool,n,1> & k,
819 const Eigen::Matrix<Scalar,n,1> & bc)
822 static_assert(kcount==Eigen::Dynamic || kcount>0 ,
"");
823 static_assert(kcount==Eigen::Dynamic || kcount<n ,
"");
824 const int ucount = n==Eigen::Dynamic ? Eigen::Dynamic : n-kcount;
825 static_assert(kcount==Eigen::Dynamic || ucount+kcount == n ,
"");
826 static_assert((n==Eigen::Dynamic) == (ucount==Eigen::Dynamic),
"");
827 static_assert((kcount==Eigen::Dynamic) == (ucount==Eigen::Dynamic),
"");
828 assert((n==Eigen::Dynamic) || n == H.rows());
829 assert((kcount==Eigen::Dynamic) || kcount == k.count());
830 typedef Eigen::Matrix<Scalar,ucount,ucount> MatrixSuu;
831 typedef Eigen::Matrix<Scalar,ucount,kcount> MatrixSuk;
832 typedef Eigen::Matrix<Scalar,n,1> VectorSn;
833 typedef Eigen::Matrix<Scalar,ucount,1> VectorSu;
834 typedef Eigen::Matrix<Scalar,kcount,1> VectorSk;
835 const auto dyn_n = n==Eigen::Dynamic ? H.rows() : n;
836 const auto dyn_kcount = kcount==Eigen::Dynamic ? k.count() : kcount;
837 const auto dyn_ucount = ucount==Eigen::Dynamic ? dyn_n- dyn_kcount : ucount;
840 MatrixSuu Huu(dyn_ucount,dyn_ucount);
841 MatrixSuk Huk(dyn_ucount,dyn_kcount);
842 VectorSu mrhs(dyn_ucount);
843 VectorSk bck(dyn_kcount);
847 for(
int i = 0;i<dyn_n;i++)
858 for(
int j = 0;j<dyn_n;j++)
876 std::conditional<Hpd,
877 Eigen::LLT<MatrixSuu>,
886 Eigen::CompleteOrthogonalDecomposition<MatrixSuu>>::type
888 VectorSu xu = Solver(Huu).solve(-mrhs);
893 for(
int i = 0;i<dyn_n;i++)
#define IGL_INLINE
Definition igl_inline.h:15
const auto all
Definition placeholders.h:14
bool is_symmetric(const Eigen::SparseMatrix< AT > &A)
Returns true if the given matrix is symmetric.
void slice(const Eigen::SparseMatrix< TX > &X, const Eigen::DenseBase< DerivedR > &R, const Eigen::DenseBase< DerivedC > &C, Eigen::SparseMatrix< TY > &Y)
Act like the matlab X(row_indices,col_indices) operator, where row_indices, col_indices are non-negat...
bool min_quad_with_fixed(const Eigen::SparseMatrix< T > &A, const Eigen::MatrixBase< DerivedB > &B, const Eigen::MatrixBase< Derivedknown > &known, const Eigen::MatrixBase< DerivedY > &Y, const Eigen::SparseMatrix< T > &Aeq, const Eigen::MatrixBase< DerivedBeq > &Beq, const bool pd, Eigen::PlainObjectBase< DerivedZ > &Z)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition min_quad_with_fixed.impl.h:590
S_type EPS()
Function returning EPS for corresponding type.
void find(const Eigen::SparseMatrix< T > &X, Eigen::DenseBase< DerivedI > &I, Eigen::DenseBase< DerivedJ > &J, Eigen::DenseBase< DerivedV > &V)
Find the non-zero entries and there respective indices in a sparse matrix.
void cat(const int dim, const Eigen::SparseMatrix< Scalar > &A, const Eigen::SparseMatrix< Scalar > &B, Eigen::SparseMatrix< Scalar > &C)
Perform concatenation of a two sparse matrices along a single dimension If dim == 1,...
bool min_quad_with_fixed_solve(const min_quad_with_fixed_data< T > &data, const Eigen::MatrixBase< DerivedB > &B, const Eigen::MatrixBase< DerivedY > &Y, const Eigen::MatrixBase< DerivedBeq > &Beq, Eigen::PlainObjectBase< DerivedZ > &Z, Eigen::PlainObjectBase< Derivedsol > &sol)
Solves a system previously factored using min_quad_with_fixed_precompute.
Definition min_quad_with_fixed.impl.h:417
bool min_quad_with_fixed_precompute(const Eigen::SparseMatrix< T > &A, const Eigen::MatrixBase< Derivedknown > &known, const Eigen::SparseMatrix< T > &Aeq, const bool pd, min_quad_with_fixed_data< T > &data)
Minimize a convex quadratic energy subject to fixed value and linear equality constraints.
Definition min_quad_with_fixed.impl.h:31
Parameters and precomputed values for min_quad_with_fixed.
Definition min_quad_with_fixed.h:166
Eigen::VectorXi known
Indices of known variables.
Definition min_quad_with_fixed.h:174
Eigen::SparseQR< Eigen::SparseMatrix< T >, Eigen::COLAMDOrdering< int > > AeqTQR
Definition min_quad_with_fixed.h:201
@ LU
Definition min_quad_with_fixed.h:188
@ LDLT
Definition min_quad_with_fixed.h:187
@ QR_LLT
Definition min_quad_with_fixed.h:189
@ LLT
Definition min_quad_with_fixed.h:186
Eigen::SimplicialLDLT< Eigen::SparseMatrix< T > > ldlt
Definition min_quad_with_fixed.h:194
Eigen::SparseMatrix< T > preY
Matrix multiplied against Y when constructing right hand side.
Definition min_quad_with_fixed.h:182
Eigen::VectorXi unknown
Indices of unknown variables.
Definition min_quad_with_fixed.h:176
Eigen::SimplicialLLT< Eigen::SparseMatrix< T > > llt
Solver data (factorization).
Definition min_quad_with_fixed.h:193
Eigen::SparseMatrix< T > AeqTQ2
Definition min_quad_with_fixed.h:207
Eigen::SparseMatrix< T > AeqTQ1
Definition min_quad_with_fixed.h:205
Eigen::SparseLU< Eigen::SparseMatrix< T, Eigen::ColMajor >, Eigen::COLAMDOrdering< int > > lu
Definition min_quad_with_fixed.h:195
int n
Size of original system: number of unknowns + number of knowns.
Definition min_quad_with_fixed.h:168
bool Aeq_li
QR factorization Are rows of Aeq linearly independent?
Definition min_quad_with_fixed.h:198
Eigen::VectorXi lagrange
Indices of lagrange variables.
Definition min_quad_with_fixed.h:178
bool Auu_sym
Whether A(unknown,unknown) is symmetric.
Definition min_quad_with_fixed.h:172
int neq
Columns of Aeq corresponding to unknowns.
Definition min_quad_with_fixed.h:200
Eigen::SparseMatrix< T > AeqTR1
Definition min_quad_with_fixed.h:209
Eigen::VectorXi unknown_lagrange
Indices of unknown variable followed by Indices of lagrange variables.
Definition min_quad_with_fixed.h:180
Eigen::SparseMatrix< T > AeqTET
Definition min_quad_with_fixed.h:212
bool Auu_pd
Whether A(unknown,unknown) is positive definite.
Definition min_quad_with_fixed.h:170
Eigen::SparseMatrix< T > AeqTR1T
Definition min_quad_with_fixed.h:210
Eigen::SparseMatrix< T > AeqTQ2T
Definition min_quad_with_fixed.h:208
Eigen::SparseMatrix< T > Aeqk
Definition min_quad_with_fixed.h:202
Eigen::SparseMatrix< T > Auu
Definition min_quad_with_fixed.h:204
enum igl::min_quad_with_fixed_data::SolverType solver_type
Eigen::SparseMatrix< T > Aequ
Definition min_quad_with_fixed.h:203
Eigen::SparseMatrix< T > AeqTE
Definition min_quad_with_fixed.h:211
Eigen::SparseMatrix< T > AeqTQ1T
Definition min_quad_with_fixed.h:206