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