Skip to content

Commit

Permalink
All prior Hessian methods return void values
Browse files Browse the repository at this point in the history
This removes two checks on Succeeded::no in GeneralisedObjectiveFunction
  • Loading branch information
robbietuk committed Jul 20, 2021
1 parent 59aed0b commit 15aebe7
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 50 deletions.
6 changes: 3 additions & 3 deletions src/include/stir/recon_buildblock/GeneralisedPrior.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class GeneralisedPrior:
Note that a row corresponds to an object of `DataT`.
The method (as implemented in derived classes) should store the result in \c prior_Hessian_for_single_densel.
*/
virtual Succeeded
virtual void
compute_Hessian(DataT& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
const DataT& current_image_estimate) const;
Expand All @@ -80,7 +80,7 @@ class GeneralisedPrior:
Instead, accumulate_Hessian_times_input() should be used. This method remains for backwards comparability.
\warning The derived class should accumulate in \a output.
*/
virtual Succeeded
virtual void
add_multiplication_with_approximate_Hessian(DataT& output,
const DataT& input) const;

Expand All @@ -89,7 +89,7 @@ class GeneralisedPrior:
derived class.
\warning The derived class should accumulate in \a output.
*/
virtual Succeeded
virtual void
accumulate_Hessian_times_input(DataT& output,
const DataT& current_estimate,
const DataT& input) const;
Expand Down
4 changes: 2 additions & 2 deletions src/include/stir/recon_buildblock/LogcoshPrior.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,13 @@ class LogcoshPrior: public
void parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>& parabolic_surrogate_curvature,
const DiscretisedDensity<3,elemT> &current_image_estimate);

virtual Succeeded
virtual void
compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
const DiscretisedDensity<3,elemT> &current_image_estimate) const;

//! Compute the multiplication of the hessian of the prior (at \c current_estimate) and the \c input.
virtual Succeeded accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
virtual void accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
const DiscretisedDensity<3,elemT>& input) const;

Expand Down
6 changes: 3 additions & 3 deletions src/include/stir/recon_buildblock/QuadraticPrior.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,20 +118,20 @@ class QuadraticPrior: public
void parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>& parabolic_surrogate_curvature,
const DiscretisedDensity<3,elemT> &current_image_estimate);

virtual Succeeded
virtual void
compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
const DiscretisedDensity<3,elemT> &current_image_estimate) const;

//! Call accumulate_Hessian_times_input
virtual Succeeded
virtual void
add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& input) const;

//! Compute the multiplication of the hessian of the prior multiplied by the input.
//! For the quadratic function, the hessian of the prior is 1.
//! Therefore this will return the weights multiplied by the input.
virtual Succeeded accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
virtual void accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
const DiscretisedDensity<3,elemT>& input) const;

Expand Down
6 changes: 3 additions & 3 deletions src/include/stir/recon_buildblock/RelativeDifferencePrior.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,16 @@ class RelativeDifferencePrior: public
void compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient,
const DiscretisedDensity<3,elemT> &current_image_estimate);

virtual Succeeded compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
virtual void compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
const DiscretisedDensity<3,elemT> &current_image_estimate) const;

virtual Succeeded
virtual void
add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& input) const;

//! Compute the multiplication of the hessian of the prior multiplied by the input.
virtual Succeeded accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
virtual void accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
const DiscretisedDensity<3,elemT>& input) const;

Expand Down
9 changes: 2 additions & 7 deletions src/recon_buildblock/GeneralisedObjectiveFunction.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -263,10 +263,7 @@ add_multiplication_with_approximate_sub_Hessian(TargetT& output,
{
// TODO used boost:scoped_ptr
shared_ptr<TargetT> prior_output_sptr(output.get_empty_copy());
if (this->prior_sptr->add_multiplication_with_approximate_Hessian(*prior_output_sptr, output) ==
Succeeded::no)
return Succeeded::no;

this->prior_sptr->add_multiplication_with_approximate_Hessian(*prior_output_sptr, output);

// (*prior_output_sptr)/= num_subsets;
// output -= *prior_output_sptr;
Expand Down Expand Up @@ -383,9 +380,7 @@ accumulate_sub_Hessian_times_input(TargetT& output,
{
// TODO used boost:scoped_ptr
shared_ptr<TargetT> prior_output_sptr(output.get_empty_copy());
if (this->prior_sptr->accumulate_Hessian_times_input(*prior_output_sptr, current_image_estimate, output) ==
Succeeded::no)
return Succeeded::no;
this->prior_sptr->accumulate_Hessian_times_input(*prior_output_sptr, current_image_estimate, output);

typename TargetT::const_full_iterator prior_output_iter = prior_output_sptr->begin_all_const();
const typename TargetT::const_full_iterator end_prior_output_iter = prior_output_sptr->end_all_const();
Expand Down
9 changes: 3 additions & 6 deletions src/recon_buildblock/GeneralisedPrior.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ set_up(shared_ptr<const TargetT> const&)
}

template <typename TargetT>
Succeeded
void
GeneralisedPrior<TargetT>::
compute_Hessian(TargetT& output,
const BasicCoordinate<3,int>& coords,
Expand All @@ -62,30 +62,27 @@ compute_Hessian(TargetT& output,
error("GeneralisedPrior:\n compute_Hessian implementation is not overloaded by your convex prior.");
else
error("GeneralisedPrior:\n compute_Hessian is not implemented because the prior is not convex.");
return Succeeded::no;
}

template <typename TargetT>
Succeeded
void
GeneralisedPrior<TargetT>::
add_multiplication_with_approximate_Hessian(TargetT& output,
const TargetT& input) const
{
error("GeneralisedPrior:\n"
"add_multiplication_with_approximate_Hessian implementation is not overloaded by your prior.");
return Succeeded::no;
}

template <typename TargetT>
Succeeded
void
GeneralisedPrior<TargetT>::
accumulate_Hessian_times_input(TargetT& output,
const TargetT& current_estimate,
const TargetT& input) const
{
error("GeneralisedPrior:\n"
"accumulate_Hessian_times_input implementation is not overloaded by your prior.");
return Succeeded::no;
}

template <typename TargetT>
Expand Down
11 changes: 4 additions & 7 deletions src/recon_buildblock/LogcoshPrior.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient,
}

template <typename elemT>
Succeeded
void
LogcoshPrior<elemT>::
compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
Expand All @@ -394,7 +394,7 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
prior_Hessian_for_single_densel.fill(0);
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

this->check(current_image_estimate);
Expand Down Expand Up @@ -458,8 +458,6 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
}
prior_Hessian_for_single_densel_cast[z+dz][y+dy][x+dx] = + current*this->penalisation_factor;
}

return Succeeded::yes;
}


Expand Down Expand Up @@ -533,7 +531,7 @@ LogcoshPrior<elemT>::parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>&
}

template <typename elemT>
Succeeded
void
LogcoshPrior<elemT>::
accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
Expand All @@ -545,7 +543,7 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
assert( output.has_same_characteristics(input));
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

DiscretisedDensityOnCartesianGrid<3,elemT>& output_cast =
Expand Down Expand Up @@ -612,7 +610,6 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
}
}
}
return Succeeded::yes;
}

template <typename elemT>
Expand Down
16 changes: 6 additions & 10 deletions src/recon_buildblock/QuadraticPrior.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient,
}

template <typename elemT>
Succeeded
void
QuadraticPrior<elemT>::
compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
Expand All @@ -447,7 +447,7 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
prior_Hessian_for_single_densel.fill(0);
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

this->check(current_image_estimate);
Expand Down Expand Up @@ -512,8 +512,6 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
}
prior_Hessian_for_single_densel_cast[z+dz][y+dy][x+dx] = + current*this->penalisation_factor;
}

return Succeeded::yes;
}

template <typename elemT>
Expand Down Expand Up @@ -598,7 +596,7 @@ QuadraticPrior<elemT>::parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>
}

template <typename elemT>
Succeeded
void
QuadraticPrior<elemT>::
add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& input) const
Expand All @@ -609,7 +607,7 @@ add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
assert( output.has_same_characteristics(input));
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

this->check(input);
Expand Down Expand Up @@ -668,11 +666,10 @@ add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
}
}
}
return Succeeded::yes;
}

template <typename elemT>
Succeeded
void
QuadraticPrior<elemT>::
accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
Expand All @@ -684,7 +681,7 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
assert( output.has_same_characteristics(input));
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

this->check(input);
Expand Down Expand Up @@ -761,7 +758,6 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
}
}
}
return Succeeded::yes;
}

template <typename elemT>
Expand Down
14 changes: 5 additions & 9 deletions src/recon_buildblock/RelativeDifferencePrior.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient,
}

template <typename elemT>
Succeeded
void
RelativeDifferencePrior<elemT>::
compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
const BasicCoordinate<3,int>& coords,
Expand All @@ -441,7 +441,7 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
prior_Hessian_for_single_densel.fill(0);
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

this->check(current_image_estimate);
Expand Down Expand Up @@ -506,22 +506,19 @@ compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel,
}
prior_Hessian_for_single_densel_cast[z+dz][y+dy][x+dx] = + current*this->penalisation_factor;
}

return Succeeded::yes;
}

template <typename elemT>
Succeeded
void
RelativeDifferencePrior<elemT>::
add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& input) const
{
error("add_multiplication_with_approximate_Hessian() is not implemented in Relative Difference Prior.");
return Succeeded::no;
}

template <typename elemT>
Succeeded
void
RelativeDifferencePrior<elemT>::
accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
const DiscretisedDensity<3,elemT>& current_estimate,
Expand All @@ -533,7 +530,7 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
assert( output.has_same_characteristics(input));
if (this->penalisation_factor==0)
{
return Succeeded::yes;
return;
}

DiscretisedDensityOnCartesianGrid<3,elemT>& output_cast =
Expand Down Expand Up @@ -608,7 +605,6 @@ accumulate_Hessian_times_input(DiscretisedDensity<3,elemT>& output,
}
}
}
return Succeeded::yes;
}

template <typename elemT>
Expand Down

0 comments on commit 15aebe7

Please sign in to comment.