Line data Source code
1 : #include "WLSSubsetProblem.h" 2 : 3 : namespace elsa 4 : { 5 : 6 : template <typename data_t> 7 : WLSSubsetProblem<data_t>::WLSSubsetProblem( 8 : const LinearOperator<data_t>& A, const DataContainer<data_t>& b, 9 : const std::vector<std::unique_ptr<LinearOperator<data_t>>>& subsetAs) 10 : : SubsetProblem<data_t>(WLSProblem<data_t>(A, b), *wlsProblemsFromOperators(subsetAs, b)) 11 2 : { 12 2 : } 13 : 14 : template <typename data_t> 15 : auto WLSSubsetProblem<data_t>::cloneImpl() const -> WLSSubsetProblem<data_t>* 16 4 : { 17 4 : return new WLSSubsetProblem<data_t>(*this); 18 4 : } 19 : 20 : template <typename data_t> 21 : std::unique_ptr<std::vector<std::unique_ptr<Problem<data_t>>>> 22 : WLSSubsetProblem<data_t>::wlsProblemsFromOperators( 23 : const std::vector<std::unique_ptr<LinearOperator<data_t>>>& subsetAs, 24 : const DataContainer<data_t>& b) 25 2 : { 26 : // Checks for blocked data descriptor and block index out of bounds are already done in 27 : // the DataContainer, no need to do them here. 28 : 29 2 : auto subProblems = std::make_unique<std::vector<std::unique_ptr<Problem<data_t>>>>(0); 30 10 : for (long unsigned int i = 0; i < subsetAs.size(); i++) { 31 8 : subProblems->emplace_back(std::make_unique<WLSProblem<data_t>>( 32 8 : *subsetAs[i], b.getBlock(static_cast<index_t>(i)))); 33 8 : } 34 : 35 2 : return subProblems; 36 2 : } 37 : 38 : // ------------------------------------------ 39 : // explicit template instantiation 40 : template class WLSSubsetProblem<float>; 41 : template class WLSSubsetProblem<double>; 42 : } // namespace elsa