void projectorFromSvd(const Eigen::MatrixXd& jac, Eigen::JacobiSVD<Eigen::MatrixXd>& svd, Eigen::VectorXd& svdSingular, Eigen::MatrixXd& preResult, Eigen::MatrixXd& result, double epsilon=std::numeric_limits<double>::epsilon(), double minTol=1e-8) { // we are force to compute the Full matrix because of // the nullspace matrix computation svd.compute(jac, Eigen::ComputeFullU | Eigen::ComputeFullV); double tolerance = epsilon*double(std::max(jac.cols(), jac.rows()))* std::abs(svd.singularValues()[0]); tolerance = std::max(tolerance, minTol); svdSingular.setOnes(); for(int i = 0; i < svd.singularValues().rows(); ++i) { svdSingular[i] = svd.singularValues()[i] > tolerance ? 0. : 1.; } preResult.noalias() = svd.matrixV()*svdSingular.asDiagonal(); result.noalias() = preResult*svd.matrixV().adjoint(); }
void activation_and_gradient(const Eigen::MatrixBase<T>& inputs, Eigen::VectorXd& activation, Eigen::VectorXd& gradient) { if (&inputs != &activation) { activation = inputs; } gradient.setOnes(); }
void gradient(const Eigen::MatrixBase<T>& inputs, Eigen::VectorXd& derivative) { derivative.setOnes(); }