DenseSymmetricMatrixPair construct_neighborhood_preserving_eigenproblem(SparseWeightMatrix W, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, unsigned int dimension) { timed_context context("NPE eigenproblem construction"); DenseSymmetricMatrix lhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseSymmetricMatrix rhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseVector rank_update_vector_i(dimension); DenseVector rank_update_vector_j(dimension); for (RandomAccessIterator iter=begin; iter!=end; ++iter) { feature_vector_callback(*iter,rank_update_vector_i); rhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i); } for (int i=0; i<W.outerSize(); ++i) { for (SparseWeightMatrix::InnerIterator it(W,i); it; ++it) { feature_vector_callback(begin[it.row()],rank_update_vector_i); feature_vector_callback(begin[it.col()],rank_update_vector_j); lhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i, rank_update_vector_j, it.value()); } } rhs += rhs.transpose(); rhs /= 2; return DenseSymmetricMatrixPair(lhs,rhs); }
DenseSymmetricMatrixPair construct_locality_preserving_eigenproblem(SparseWeightMatrix L, DenseDiagonalMatrix D, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, unsigned int dimension) { timed_context context("Constructing LPP eigenproblem"); DenseSymmetricMatrix lhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseSymmetricMatrix rhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseVector rank_update_vector_i(dimension); DenseVector rank_update_vector_j(dimension); for (RandomAccessIterator iter=begin; iter!=end; ++iter) { feature_vector_callback(*iter,rank_update_vector_i); rhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i,D.diagonal()(iter-begin)); } for (int i=0; i<L.outerSize(); ++i) { for (SparseWeightMatrix::InnerIterator it(L,i); it; ++it) { feature_vector_callback(begin[it.row()],rank_update_vector_i); feature_vector_callback(begin[it.col()],rank_update_vector_j); lhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i, rank_update_vector_j, it.value()); } } return DenseSymmetricMatrixPair(lhs,rhs); }
DenseSymmetricMatrixPair construct_lltsa_eigenproblem(SparseWeightMatrix W, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension) { timed_context context("LLTSA eigenproblem construction"); DenseSymmetricMatrix lhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseSymmetricMatrix rhs = DenseSymmetricMatrix::Zero(dimension,dimension); DenseVector rank_update_vector_i(dimension); DenseVector rank_update_vector_j(dimension); DenseVector sum = DenseVector::Zero(dimension); //RESTRICT_ALLOC; for (RandomAccessIterator iter=begin; iter!=end; ++iter) { feature_vector_callback.vector(*iter,rank_update_vector_i); sum += rank_update_vector_i; rhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i); } rhs.selfadjointView<Eigen::Upper>().rankUpdate(sum,-1./(end-begin)); for (int i=0; i<W.outerSize(); ++i) { for (SparseWeightMatrix::InnerIterator it(W,i); it; ++it) { feature_vector_callback.vector(begin[it.row()],rank_update_vector_i); feature_vector_callback.vector(begin[it.col()],rank_update_vector_j); lhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i, rank_update_vector_j, it.value()); } } lhs.selfadjointView<Eigen::Upper>().rankUpdate(sum,-1./(end-begin)); rhs += rhs.transpose().eval(); rhs /= 2; //UNRESTRICT_ALLOC; return DenseSymmetricMatrixPair(lhs,rhs); }