Line data Source code
1 : #include "SubsetProblem.h" 2 : #include "TypeCasts.hpp" 3 : 4 : namespace elsa 5 : { 6 : 7 : template <typename data_t> 8 : SubsetProblem<data_t>::SubsetProblem( 9 : const Problem<data_t>& fullProblem, 10 : const std::vector<std::unique_ptr<Problem<data_t>>>& subsetProblems) 11 : : Problem<data_t>(fullProblem.getDataTerm(), fullProblem.getRegularizationTerms(), 12 : fullProblem.getCurrentSolution()), 13 : _subsetProblems(0) 14 2 : { 15 : // TODO: maybe add a sanity check to make sure the domain of all problems matches 16 8 : for (const auto& problem : subsetProblems) { 17 8 : _subsetProblems.emplace_back(problem->clone()); 18 8 : } 19 2 : } 20 : 21 : template <typename data_t> 22 : SubsetProblem<data_t>::SubsetProblem(const SubsetProblem<data_t>& subsetProblem) 23 : : Problem<data_t>(subsetProblem.getDataTerm(), subsetProblem.getRegularizationTerms(), 24 : subsetProblem.getCurrentSolution()), 25 : _subsetProblems(0) 26 4 : { 27 16 : for (const auto& problem : subsetProblem._subsetProblems) { 28 16 : _subsetProblems.emplace_back(problem->clone()); 29 16 : } 30 4 : } 31 : 32 : template <typename data_t> 33 : DataContainer<data_t> SubsetProblem<data_t>::getSubsetGradient(index_t subset) 34 80 : { 35 80 : if (subset < 0 || asUnsigned(subset) >= _subsetProblems.size()) { 36 0 : throw std::invalid_argument( 37 0 : "SubsetProblem: subset index out of bounds for number of subsets"); 38 0 : } 39 : 40 80 : _subsetProblems[asUnsigned(subset)]->getCurrentSolution() = this->getCurrentSolution(); 41 80 : return _subsetProblems[asUnsigned(subset)]->getGradient(); 42 80 : } 43 : 44 : template <typename data_t> 45 : void SubsetProblem<data_t>::getSubsetGradient(DataContainer<data_t>& result, index_t subset) 46 0 : { 47 0 : if (subset < 0 || asUnsigned(subset) >= _subsetProblems.size()) { 48 0 : throw std::invalid_argument( 49 0 : "SubsetProblem: subset index out of bounds for number of subsets"); 50 0 : } 51 0 : _subsetProblems[asUnsigned(subset)]->getCurrentSolution() = this->getCurrentSolution(); 52 0 : _subsetProblems[asUnsigned(subset)]->getGradient(result); 53 0 : } 54 : 55 : template <typename data_t> 56 : index_t SubsetProblem<data_t>::getNumberOfSubsets() const 57 2 : { 58 2 : return asSigned(_subsetProblems.size()); 59 2 : } 60 : 61 : template <typename data_t> 62 : auto SubsetProblem<data_t>::cloneImpl() const -> SubsetProblem<data_t>* 63 0 : { 64 0 : return new SubsetProblem(*this); 65 0 : } 66 : 67 : // ------------------------------------------ 68 : // explicit template instantiation 69 : template class SubsetProblem<float>; 70 : template class SubsetProblem<double>; 71 : } // namespace elsa