Line data Source code
1 : #include "Residual.h" 2 : 3 : #include <stdexcept> 4 : 5 : namespace elsa 6 : { 7 : template <typename data_t> 8 : Residual<data_t>::Residual(const DataDescriptor& domainDescriptor, 9 : const DataDescriptor& rangeDescriptor) 10 : : _domainDescriptor{domainDescriptor.clone()}, _rangeDescriptor{rangeDescriptor.clone()} 11 3884 : { 12 3884 : } 13 : 14 : template <typename data_t> 15 : const DataDescriptor& Residual<data_t>::getDomainDescriptor() const 16 25024 : { 17 25024 : return *_domainDescriptor; 18 25024 : } 19 : 20 : template <typename data_t> 21 : const DataDescriptor& Residual<data_t>::getRangeDescriptor() const 22 11556 : { 23 11556 : return *_rangeDescriptor; 24 11556 : } 25 : 26 : template <typename data_t> 27 : DataContainer<data_t> Residual<data_t>::evaluate(const DataContainer<data_t>& x) const 28 11212 : { 29 11212 : DataContainer<data_t> result(*_rangeDescriptor, x.getDataHandlerType()); 30 11212 : evaluate(x, result); 31 11212 : return result; 32 11212 : } 33 : 34 : template <typename data_t> 35 : void Residual<data_t>::evaluate(const DataContainer<data_t>& x, 36 : DataContainer<data_t>& result) const 37 11212 : { 38 11212 : if (x.getSize() != getDomainDescriptor().getNumberOfCoefficients() 39 11212 : || result.getSize() != getRangeDescriptor().getNumberOfCoefficients()) 40 0 : throw InvalidArgumentError("Residual::evaluate: argument sizes do not match residual"); 41 : 42 11212 : evaluateImpl(x, result); 43 11212 : } 44 : 45 : template <typename data_t> 46 : LinearOperator<data_t> Residual<data_t>::getJacobian(const DataContainer<data_t>& x) 47 10915 : { 48 10915 : return getJacobianImpl(x); 49 10915 : } 50 : 51 : template <typename data_t> 52 : bool Residual<data_t>::isEqual(const Residual<data_t>& other) const 53 269 : { 54 269 : return !static_cast<bool>(*_domainDescriptor != *other._domainDescriptor 55 269 : || *_rangeDescriptor != *other._rangeDescriptor); 56 269 : } 57 : 58 : // ------------------------------------------ 59 : // explicit template instantiation 60 : template class Residual<float>; 61 : template class Residual<double>; 62 : template class Residual<complex<float>>; 63 : template class Residual<complex<double>>; 64 : 65 : } // namespace elsa