STIR 6.4.0
RelativeDifferencePrior.h
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2000- 2011, Hammersmith Imanet Ltd
5 Copyright (C) 2019- 2020, UCL,
6 This file is part of STIR.
7
8 SPDX-License-Identifier: Apache-2.0
9
10 See STIR/LICENSE.txt for details.
11*/
22
23#ifndef __stir_recon_buildblock_RelativeDifferencePrior_H__
24#define __stir_recon_buildblock_RelativeDifferencePrior_H__
25
28#include "stir/Array.h"
30#include "stir/shared_ptr.h"
31#include <string>
32
33START_NAMESPACE_STIR
34
96template <typename elemT>
97class RelativeDifferencePrior : public RegisteredParsingObject<RelativeDifferencePrior<elemT>,
98 GeneralisedPrior<DiscretisedDensity<3, elemT>>,
99 GeneralisedPrior<DiscretisedDensity<3, elemT>>>
100{
101private:
105 base_type;
106
107public:
109 static const char* const registered_name;
110
113
115 RelativeDifferencePrior(const bool only_2D, float penalization_factor, float gamma, float epsilon);
116
118 double compute_value(const DiscretisedDensity<3, elemT>& current_image_estimate) override;
119
122 const DiscretisedDensity<3, elemT>& current_image_estimate) override;
123
124 void compute_Hessian(DiscretisedDensity<3, elemT>& prior_Hessian_for_single_densel,
125 const BasicCoordinate<3, int>& coords,
126 const DiscretisedDensity<3, elemT>& current_image_estimate) const override;
127
129 const DiscretisedDensity<3, elemT>& input) const override;
130
133 const DiscretisedDensity<3, elemT>& current_estimate,
134 const DiscretisedDensity<3, elemT>& input) const override;
135
137 float get_gamma() const;
139 void set_gamma(float e);
140
142 float get_epsilon() const;
144 void set_epsilon(float e);
145
148
150 void set_weights(const Array<3, float>&);
151
153
157 shared_ptr<DiscretisedDensity<3, elemT>> get_kappa_sptr() const;
158
160 void set_kappa_sptr(const shared_ptr<DiscretisedDensity<3, elemT>>&);
161
163 virtual Succeeded set_up(shared_ptr<const DiscretisedDensity<3, elemT>> const& target_sptr) override;
164
165 bool is_convex() const override;
166
167protected:
169 float gamma;
170
172 float epsilon;
173
177
182
184
190 std::string kappa_filename;
191
193 void check(DiscretisedDensity<3, elemT> const& current_image_estimate) const override;
194
195 void set_defaults() override;
196 void initialise_keymap() override;
197 bool post_processing() override;
198
199protected:
200 shared_ptr<DiscretisedDensity<3, elemT>> kappa_ptr;
201
203
221 double value(const elemT x_j, const elemT x_k) const;
222 elemT derivative_10(const elemT x, const elemT y) const;
223 elemT derivative_20(const elemT x_j, const elemT x_k) const;
224 elemT derivative_11(const elemT x_j, const elemT x_k) const;
226};
227
228END_NAMESPACE_STIR
229
230#endif
defines the stir::Array class for multi-dimensional (numeric) arrays
defines the stir::DiscretisedDensity class
Declaration of class stir::GeneralisedPrior.
Declaration of class stir::RegisteredParsingObject.
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
This abstract class is the basis for all image representations.
Definition DiscretisedDensity.h:99
A base class for 'generalised' priors, i.e. priors for which at least a 'gradient' is defined.
Definition GeneralisedPrior.h:44
Parent class for all leaves in a RegisteredObject hierarchy that do parsing of parameter files.
Definition RegisteredParsingObject.h:78
std::string gradient_filename_prefix
filename prefix for outputing the gradient whenever compute_gradient() is called.
Definition RelativeDifferencePrior.h:181
void accumulate_Hessian_times_input(DiscretisedDensity< 3, elemT > &output, const DiscretisedDensity< 3, elemT > &current_estimate, const DiscretisedDensity< 3, elemT > &input) const override
Compute the multiplication of the hessian of the prior multiplied by the input.
Definition RelativeDifferencePrior.cxx:536
float get_gamma() const
get the gamma value used in RDP
Definition RelativeDifferencePrior.cxx:168
void set_kappa_sptr(const shared_ptr< DiscretisedDensity< 3, elemT > > &)
set kappa image
Definition RelativeDifferencePrior.cxx:242
virtual Succeeded set_up(shared_ptr< const DiscretisedDensity< 3, elemT > > const &target_sptr) override
Has to be called before using this object.
Definition RelativeDifferencePrior.cxx:113
void set_gamma(float e)
set the gamma value used in the RDP
Definition RelativeDifferencePrior.cxx:176
std::string kappa_filename
Filename for the image that will be read by post_processing()
Definition RelativeDifferencePrior.h:190
static const char *const registered_name
Name which will be used when parsing a GeneralisedPrior object.
Definition RelativeDifferencePrior.h:109
Array< 3, float > get_weights() const
get penalty weights for the neigbourhood
Definition RelativeDifferencePrior.cxx:213
void compute_gradient(DiscretisedDensity< 3, elemT > &prior_gradient, const DiscretisedDensity< 3, elemT > &current_image_estimate) override
compute gradient
Definition RelativeDifferencePrior.cxx:376
float get_epsilon() const
get the epsilon value used in RDP
Definition RelativeDifferencePrior.cxx:184
double compute_value(const DiscretisedDensity< 3, elemT > &current_image_estimate) override
compute the value of the function
Definition RelativeDifferencePrior.cxx:304
RelativeDifferencePrior()
Default constructor.
Definition RelativeDifferencePrior.cxx:153
void initialise_keymap() override
sets key for penalisation factor
Definition RelativeDifferencePrior.cxx:45
void set_defaults() override
sets value for penalisation factor
Definition RelativeDifferencePrior.cxx:137
float gamma
Create variable gamma for Relative Difference Penalty.
Definition RelativeDifferencePrior.h:169
shared_ptr< DiscretisedDensity< 3, elemT > > get_kappa_sptr() const
get current kappa image
Definition RelativeDifferencePrior.cxx:234
void set_epsilon(float e)
set the epsilon value used in the RDP
Definition RelativeDifferencePrior.cxx:192
bool post_processing() override
This will be called at the end of the parsing.
Definition RelativeDifferencePrior.cxx:60
void set_weights(const Array< 3, float > &)
set penalty weights for the neigbourhood
Definition RelativeDifferencePrior.cxx:221
bool is_convex() const override
Indicates if the prior is a smooth convex function.
Definition RelativeDifferencePrior.cxx:160
void compute_Hessian(DiscretisedDensity< 3, elemT > &prior_Hessian_for_single_densel, const BasicCoordinate< 3, int > &coords, const DiscretisedDensity< 3, elemT > &current_image_estimate) const override
This computes a single row of the Hessian.
Definition RelativeDifferencePrior.cxx:456
void add_multiplication_with_approximate_Hessian(DiscretisedDensity< 3, elemT > &output, const DiscretisedDensity< 3, elemT > &input) const override
This should compute the multiplication of the Hessian with a vector and add it to output.
Definition RelativeDifferencePrior.cxx:528
void check(DiscretisedDensity< 3, elemT > const &current_image_estimate) const override
Check that the prior is ready to be used.
Definition RelativeDifferencePrior.cxx:122
bool only_2D
can be set during parsing to restrict the weights to the 2D case
Definition RelativeDifferencePrior.h:175
float epsilon
Create variable epsilon for Relative Difference Penalty.
Definition RelativeDifferencePrior.h:172
Array< 3, float > weights
penalty weights
Definition RelativeDifferencePrior.h:188
double value(const elemT x_j, const elemT x_k) const
The value and partial derivatives of the Relative Difference Prior.
Definition RelativeDifferencePrior.cxx:281
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition Succeeded.h:44
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...