Line data Source code
1 : #include "ProximalHuber.h" 2 : #include "DataContainer.h" 3 : 4 : namespace elsa 5 : { 6 : template <class data_t> 7 : ProximalHuber<data_t>::ProximalHuber(data_t delta) : delta_(delta) 8 8 : { 9 8 : } 10 : 11 : template <class data_t> 12 : DataContainer<data_t> ProximalHuber<data_t>::apply(const DataContainer<data_t>& v, 13 : SelfType_t<data_t> t) const 14 8 : { 15 8 : DataContainer<data_t> out{v.getDataDescriptor()}; 16 8 : apply(v, t, out); 17 8 : return out; 18 8 : } 19 : 20 : template <class data_t> 21 : void ProximalHuber<data_t>::apply(const DataContainer<data_t>& v, SelfType_t<data_t> t, 22 : DataContainer<data_t>& prox) const 23 8 : { 24 8 : auto factor = 1 - (t / (std::max(v.l2Norm(), t) + delta_)); 25 8 : prox = factor * v; 26 8 : } 27 : 28 : // ------------------------------------------ 29 : // explicit template instantiation 30 : template class ProximalHuber<float>; 31 : template class ProximalHuber<double>; 32 : } // namespace elsa