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