// TODO: Time to finish the bells and whistles here
// TODO: Use sparse matrix representation for Jacobian, (this is lower priority since typical uses will not produce very large matrices)
// TODO: Try extracting sub matrix and solving (Certain constraints are known to eliminate variables (Radius, Fixation), if the matrix can be permuted so that a submatrix on the block diagonal is lower-triangular, then a subsystem of equations can be solved independently of the remaining equations. Moreover, if the jacobian can be permuted into a block lower triangular form, subsets of equations can be solved blockwise)
// TODO: Extract newton_update over Verticies, Curves, and Constraints into a private method
// TODO: Extract armijo_update into a private method
// TODO: Use variable_feature_size() and equation_feature_size()
if(NumVariables<NumEquations){
std::cerr<<"Variables = "<<NumVariables<<", Equations = "<<NumEquations<<". Number of variables is less than the number of equations. The sketch may be over-constrained."<<std::endl;
std::cerr<<"Linearized sketch equation could not be solved with an average error per equation less than FLT_EPSILON. Some elements may be over-constrained."<<std::endl;