#pragma once#include<vnl/vnl_math.h>#include<vnl/vnl_vector.h>#include<Eigen/Core>#include"ConstraintType.h"namespaceshapeworks{classConstraint{public:boolisViolated(constvnl_vector<double>&pt)const{returnisViolated(Eigen::Vector3d(pt[0],pt[1],pt[2]));}virtualboolisViolated(constEigen::Vector3d&pt)const=0;virtualvoidprint()const=0;// For augmented lagrangianvoidsetZ(doubleinz){z_=inz;}doublegetZ(){returnz_;}voidsetMu(doubleinmu){mu_=inmu;}doublegetMu(){returnmu_;}voidsetLambda(doubleinLambda){lambda_=inLambda;}doublegetLambda(){returnlambda_;}virtualEigen::Vector3dconstraintGradient(constEigen::Vector3d&pt)const=0;virtualdoubleconstraintEval(constEigen::Vector3d&pt)const=0;voidupdateZ(constEigen::Vector3d&pt,doubleC);voidupdateMu(constEigen::Vector3d&pt,doubleC);Eigen::Vector3dlagragianGradient(constEigen::Vector3d&pt,doubleC)const;protected:intsgn(doubleval){return(double(0)<val)-(val<double(0));}// For augmented lagrangiandoublemu_;doublez_;doublelambda_;};}// namespace shapeworks