Line data Source code
1 : #pragma once 2 : 3 : #include "Functional.h" 4 : 5 : namespace elsa 6 : { 7 : /** 8 : * @brief Class representing the smooth mixed L12 functional. 9 : * 10 : * General p,q norm definition: 11 : * @f[ 12 : * \|A\|_{p, q} = \left(\sum_{j=1}^n \left(\sum_{i=1}^m \left | a_{i j} \right |^p 13 : * \right)^{\frac{q}{p}} \right)^{\frac{1}{q}} 14 : * @f] 15 : * 16 : * The mixed L21 functional evaluates to 17 : * @f[ 18 : * \|A\|_{2, 1} = \left( \sum_{j=1}^n\left( \sum_{i=1}^m \left| a_{ij} \right|^2 19 : * \right)^{\frac{1}{2}} \right) 20 : * @f] 21 : * 22 : */ 23 : template <typename data_t = real_t> 24 : class MixedL21Norm : public Functional<data_t> 25 : { 26 : public: 27 : explicit MixedL21Norm(const DataDescriptor& domainDescriptor); 28 : 29 : MixedL21Norm(const MixedL21Norm<data_t>&) = delete; 30 : 31 8 : ~MixedL21Norm() override = default; 32 : 33 : bool isProxFriendly() const override; 34 : 35 : DataContainer<data_t> proximal(const DataContainer<data_t>& v, 36 : SelfType_t<data_t> t) const override; 37 : 38 : void proximal(const DataContainer<data_t>& v, SelfType_t<data_t> t, 39 : DataContainer<data_t>& out) const override; 40 : 41 : protected: 42 : data_t evaluateImpl(const DataContainer<data_t>& Rx) const override; 43 : 44 : void getGradientImpl(const DataContainer<data_t>& Rx, 45 : DataContainer<data_t>& out) const override; 46 : 47 : LinearOperator<data_t> getHessianImpl(const DataContainer<data_t>& Rx) const override; 48 : 49 : MixedL21Norm<data_t>* cloneImpl() const override; 50 : 51 : bool isEqual(const Functional<data_t>& other) const override; 52 : }; 53 : 54 : } // namespace elsa