.. _program_listing_file_src_function_cpu_ExemplarClusteringSubmodularFunction.h: Program Listing for File ExemplarClusteringSubmodularFunction.h =============================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``src/function/cpu/ExemplarClusteringSubmodularFunction.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef EXEMCL_FUNCTION_CPU #define EXEMCL_FUNCTION_CPU #include #include namespace exemcl::cpu { template class ExemplarClusteringSubmodularFunction : public SubmodularFunction { public: using SubmodularFunction::operator(); explicit ExemplarClusteringSubmodularFunction(const MatrixX& V, int workerCount = -1) : SubmodularFunction(workerCount), _V(std::make_unique>(V)) { MatrixX zeroVec = VectorX::Zero(_V->cols()).transpose(); _zeroVecValue = L(zeroVec); }; double operator()(const MatrixX& S) override { return ((const ExemplarClusteringSubmodularFunction*) (this))->operator()(S); }; double operator()(const MatrixX& S) const override { auto S_copy = std::make_unique>(S.cast()); // Add zero vector to data copy. S_copy->conservativeResize(S_copy->rows() + 1, Eigen::NoChange_t()); S_copy->row(S_copy->rows() - 1).setZero(); // Make calculations. HostDataType L_2 = L(*S_copy); return _zeroVecValue - L_2; }; const MatrixX& getV() const { return _V; }; private: HostDataType _zeroVecValue; const std::unique_ptr> _V; HostDataType L(const MatrixX& S_inner) const { auto* accuArray = new HostDataType[_V->rows()]; for (unsigned int i = 0; i < _V->rows(); i++) { auto min_val = std::numeric_limits::max(); for (unsigned int j = 0; j < S_inner.rows(); j++) min_val = std::min((_V->row(i) - S_inner.row(j)).squaredNorm(), min_val); accuArray[i] = min_val; } HostDataType accu = 0.0; #pragma omp simd reduction(+ : accu) for (unsigned int i = 0; i < _V->rows(); i++) accu += accuArray[i]; delete[] accuArray; return accu / static_cast(_V->rows()); }; }; } #endif // EXEMCL_FUNCTION_CPU